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使用了一个更为复杂的条件谓词:每次关闭门时,都会生成一个“生成”计数器,并且如果门现在打开或自该线程到达门以来门已经打开,则线程可能等待通过。
伙计们,您可能会笑,但我听不懂:)。 问题:

  • 根据线程T1,T2,...和执行流程向我解释arrivalGeneration == generation的用法。
  • 为什么段落说every time the gate is closed, a generation counter is incremented?怎么回事?

  • 谢谢大家!

    最佳答案

    问题#1:只要将“生成”视为您(线程)所属的组,就可以进入整个组,因此,如果打开门,则会增加组#,并且允许所有已经在等待的组中的每个人即使门再次被视为“锁定”。

    问题2:我想这是一个错误-每次打开门时,它应该显示为“...”

    07-28 00:59