实践中的 Java 并发 - 清单 14.9 解释?

Max*_*Max 5 java concurrency

很少有 JCIP 的列表出现在这里。这里还有一个(原始代码):

公共类线程门{
    私有布尔值 isOpen;
    私有整数代;

    公共同步无效关闭(){
        isOpen = false;
    }

    公共同步无效打开(){
        ++代;
        isOpen = true;
        通知所有();
    }

    公共同步无效等待()抛出 InterruptedException {
        int到达世代=世代;
        而 (!isOpen && 到达世代 == 世代) {
            等待();
        }
    }
}

书评:

await 使用的条件谓词比简单地测试 isOpen 更复杂。这是必要的,因为如果在门打开时 N 个线程正在等待,它们都应该被允许继续。但是,如果门快速连续地打开和关闭,如果 await 只检查 isOpen,则可能不会释放所有线程:当所有线程收到通知、重新获取锁并从等待中退出时,门可能再次关闭. 所以 ThreadGate 使用了一个稍微复杂一些的条件谓词:每次门关闭时,“生成”计数器都会增加,如果门现在打开或者自从这个线程到达门之后门已经打开,线程可能会通过 await .

伙计们,你可能会笑,但我无法理解:)。问题:

  1. arrivalGeneration == generation根据线程 T1、T2...和执行流程向我解释使用。
  2. 为什么段落说every time the gate is closed, a generation counter is incremented?它是怎么发生的?

感谢大家!

Max*_*Max 1

有兴趣的朋友可以在这里寻求答案。

在此清单中,等待线程 T1 感兴趣的是等待期间是否发生任何打开事件(我们不关心是否发生任何关闭事件),generation计数器帮助我们找出这一事实。