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

仅同步写入操作时,Java的boolean变量及对应类是否线程安全?

Java boolean变量的线程安全问题

问题1:仅对写入操作进行同步时,Java中的boolean类型是否具备线程安全性?

不具备。Java里的普通boolean变量本身没有线程安全特性:

  • 只同步写入的话,读操作没有同步机制保障,读线程可能从自己的本地缓存读取旧值,看不到其他线程写入的最新结果,可见性无法保证。
  • 虽然boolean的写入是原子操作(不会出现写一半的情况),但线程安全需要同时满足原子性、可见性和有序性,仅同步写入无法覆盖所有要求。

问题2:如下代码示例中,仅对boolean实例变量的写入方法添加synchronized修饰的类是否线程安全?

代码示例:

boolean foo = true;

public synchronized void setFoo(boolean foo) {
  this.foo = foo;
}

public boolean getFoo() {
  return foo;
}

这个类不是线程安全的。原因很简单:

  • setFoo加了synchronized,能保证写入操作的原子性和可见性(写操作完成后会把值刷新到主存),但getFoo没有同步修饰,读操作直接访问变量时,可能读取的是当前线程本地缓存里的旧值,无法确保看到其他线程通过setFoo写入的最新值。
  • 要让这个类线程安全,要么给getFoo也加上synchronized修饰,要么把foo声明为volatile变量(volatile能保证可见性,且boolean的读写本身是原子的)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 13:57:47