0

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;
    }
}
4

0 に答える 0