很少有 JCIP 的列表出现在这里。这里还有一个(原始代码):
公共类线程门{
私有布尔值 isOpen;
私有整数代;
公共同步无效关闭(){
isOpen = false;
}
公共同步无效打开(){
++代;
isOpen = true;
通知所有();
}
公共同步无效等待()抛出 InterruptedException {
int到达世代=世代;
而 (!isOpen && 到达世代 == 世代) {
等待();
}
}
}
书评:
await 使用的条件谓词比简单地测试 isOpen 更复杂。这是必要的,因为如果在门打开时 N 个线程正在等待,它们都应该被允许继续。但是,如果门快速连续地打开和关闭,如果 await 只检查 isOpen,则可能不会释放所有线程:当所有线程收到通知、重新获取锁并从等待中退出时,门可能再次关闭. 所以 ThreadGate 使用了一个稍微复杂一些的条件谓词:每次门关闭时,“生成”计数器都会增加,如果门现在打开或者自从这个线程到达门之后门已经打开,线程可能会通过 await .
伙计们,你可能会笑,但我无法理解:)。问题:
arrivalGeneration == generation根据线程 T1、T2...和执行流程向我解释使用。every time the gate is closed, a generation counter is incremented?它是怎么发生的?感谢大家!