package java.nio.channels.spi;
import java.nio.channels.*;
/**
* 选择键的基实现类。
*
* <p> 该类跟踪密钥的有效性并实现取消。
*
* @author Mark Reinhold
* @author JSR-51 Expert Group
* @since 1.4
*/
public abstract class AbstractSelectionKey
extends SelectionKey
{
/**
* Initializes a new instance of this class.
*/
protected AbstractSelectionKey() { }
private volatile boolean valid = true;
public final boolean isValid() {
return valid;
}
void invalidate() { // package-private
valid = false;
}
/**
* 取消这个键。
*
* <p> 如果这个键还没有被取消,那么当同步到它的选择器的取消键集时,它会被添加到它的选择器的取消键集。</p>
*/
public final void cancel() {
// 同步“this”来防止这个键被不同的线程多次取消,这可能会导致选择器的select()和通道的close()之间的竞争条件。
synchronized (this) {
if (valid) {
valid = false;
((AbstractSelector)selector()).cancel(this);
}
}
}
}