openJDK (jdk-6u23) では、以下のような AbstractSelectableChannel.register() のこの実装:
最初に、このチャネルが開いているかどうかを確認します。次に、reg lock で登録作業を行います。しかし、isOpen() テストと同期ブロックの間で close メソッドを呼び出すと、チャネルは閉じられます。次に、CLOSED を登録します。セレクター付きのチャンネル…でもこれでいいの?
public final SelectionKey register(Selector sel, int ops,
Object att)
throws ClosedChannelException
{
if (!isOpen())
throw new ClosedChannelException();
if ((ops & ~validOps()) != 0)
throw new IllegalArgumentException();
synchronized (regLock) {
if (blocking)
throw new IllegalBlockingModeException();
SelectionKey k = findKey(sel);
if (k != null) {
k.interestOps(ops);
k.attach(att);
}
if (k == null) {
// New registration
k = ((AbstractSelector)sel).register(this, ops, att);
addKey(k);
}
return k;
}
}