You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java内存模型是否阻止不同线程对volatile变量的交错写入?

关于Dekker算法在JVM下循环执行的互斥性解答

核心结论

你的理解存在偏差,该Dekker算法实现即使被两个线程循环执行,也能保证临界区同一时间只有一个线程进入,不存在你描述的同时进入临界区的问题,该示例也没有默认仅执行一次的前提。

常见误解纠正

  • 你对Java volatile的能力认知不全面:volatile除了保证内存可见性之外,还禁止指令重排序,所有对volatile变量的读写操作满足顺序一致性的全局全序要求,这是无锁互斥算法能正常运行的核心基础,并非仅提供可见性。

你假设的调度场景推演

你提到的「第二个线程停在第7行前,第一个线程先进入临界区后再恢复第二个线程」的场景,不可能出现两个线程同时进入临界区,逻辑推导如下:

  1. 第一个线程能退出第3行的while循环进入临界区,前提是它读到intentSecond == false,这个状态只会出现在第二个线程执行完第5行intentSecond = false,还没执行第7行intentSecond = true的窗口内。
  2. 此时第二个线程停在第7行前,intentSecond为false,第一个线程进入临界区后,intentFirst始终保持为true(要到第13行执行完才会被设为false)。
  3. 第二个线程被唤醒后执行第7行,将intentSecond设为true,接下来会回到第3行的循环判断,此时读取intentFirst的值一定为true,会卡在while循环中,不可能进入临界区。

Dekker算法的互斥性本质

Dekker算法通过「线程进入意向标记+轮转优先级」的双重校验,结合volatile的顺序一致性保证,永远不会出现两个线程同时判断对方意向为false的情况,天然支持循环重复执行,无需单次执行的前提。

内容的提问来源于stack exchange,提问作者George

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 22:54:01