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

《Java并发编程实战》Listing7.15:isShutdown与reservations为何无需volatile?

关于《Java并发编程实战》Listing7.15变量未加volatile的解释

先明确Listing7.15的核心逻辑:LogWriter里的isShutdown和reservations变量,所有读写操作都被同一个锁(比如ReentrantLock)的临界区包裹着,这就是它们不需要加volatile的关键原因:

  • Java内存模型里,锁的「释放」动作会强制把线程本地缓存的修改刷入主内存,而锁的「获取」动作会强制线程丢弃本地缓存,从主内存加载最新值。所以只要所有对这两个变量的访问都在锁的保护下,就不存在线程读到过期缓存副本的问题。
  • 举个具体例子:当调用shutdown()方法时,会先获取锁,修改isShutdown为true,释放锁时这个修改会刷到主存;LoggerThread每次循环都会先获取锁,此时它会从主存读取最新的isShutdown和reservations值,完全不会用到旧的缓存。
  • 另外,reservations涉及增减操作(比如reservations++),这是复合操作,volatile只能保证可见性,没法保证原子性,但锁可以同时保证可见性和原子性,用锁保护比加volatile更全面,自然不需要多此一举加volatile。

你担心的缓存副本问题,只有在变量的读写没有被同步机制(锁或volatile)覆盖时才会发生,这里锁已经完全覆盖了可见性需求,所以不需要额外加volatile。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 07:54:52