JCIP的房源很少出现在这里。这是另一个(orig. code):
公共类ThreadGate {
私有布尔isOpen;
私人int代;
公共同步void close(){
isOpen = false;
}
公共同步void open(){
++代;
isOpen = true;
notifyAll();
}
公共同步void await()引发InterruptedException {
int到达Generation =生成;
while(!isOpen &&到达Generation == generation){
等待();
}
}
}
书中评论:
等待使用的条件谓词比简单地测试isOpen更复杂。这是必需的,因为如果在打开门时有N个线程在门口等待,则应允许它们全部继续进行。但是,如果快速连续地打开和关闭门,如果等待仅检查isOpen,则可能不会释放所有线程:在所有线程收到通知,重新获取锁并退出等待状态时,门可能已再次关闭。因此ThreadGate使用了一个更为复杂的条件谓词:每次关闭门时,都会生成一个“生成”计数器,并且如果门现在打开或自该线程到达门以来门已经打开,则线程可能等待通过。
伙计们,您可能会笑,但我听不懂:)。 问题:
arrivalGeneration == generation
的用法。 every time the gate is closed, a generation counter is incremented
?怎么回事? 谢谢大家!
最佳答案
问题#1:只要将“生成”视为您(线程)所属的组,就可以进入整个组,因此,如果打开门,则会增加组#,并且允许所有已经在等待的组中的每个人即使门再次被视为“锁定”。
问题2:我想这是一个错误-每次打开门时,它应该显示为“...”