仅同步写入操作时,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
相关产品推荐
相关产品推荐

