Java内存模型是否阻止不同线程对volatile变量的交错写入?
关于Dekker算法在JVM下循环执行的互斥性解答
核心结论
你的理解存在偏差,该Dekker算法实现即使被两个线程循环执行,也能保证临界区同一时间只有一个线程进入,不存在你描述的同时进入临界区的问题,该示例也没有默认仅执行一次的前提。
常见误解纠正
- 你对Java
volatile的能力认知不全面:volatile除了保证内存可见性之外,还禁止指令重排序,所有对volatile变量的读写操作满足顺序一致性的全局全序要求,这是无锁互斥算法能正常运行的核心基础,并非仅提供可见性。
你假设的调度场景推演
你提到的「第二个线程停在第7行前,第一个线程先进入临界区后再恢复第二个线程」的场景,不可能出现两个线程同时进入临界区,逻辑推导如下:
- 第一个线程能退出第3行的while循环进入临界区,前提是它读到
intentSecond == false,这个状态只会出现在第二个线程执行完第5行intentSecond = false,还没执行第7行intentSecond = true的窗口内。 - 此时第二个线程停在第7行前,
intentSecond为false,第一个线程进入临界区后,intentFirst始终保持为true(要到第13行执行完才会被设为false)。 - 第二个线程被唤醒后执行第7行,将
intentSecond设为true,接下来会回到第3行的循环判断,此时读取intentFirst的值一定为true,会卡在while循环中,不可能进入临界区。
Dekker算法的互斥性本质
Dekker算法通过「线程进入意向标记+轮转优先级」的双重校验,结合volatile的顺序一致性保证,永远不会出现两个线程同时判断对方意向为false的情况,天然支持循环重复执行,无需单次执行的前提。
内容的提问来源于stack exchange,提问作者George
相关产品推荐
相关产品推荐

