AtomicBoolean与同步块有什么区别

use*_*154 5 java concurrency synchronization boolean atomicity

我试图理解以下两个代码块之间的区别

AtomicBoolean ab = new AtomicBoolean(false);  

using the following to get and set state. .
ab.get();
ab.set(X);

vs. 

private boolean ab = false;
private final Object myboollock = new Ojbect();

public void setAB(boolean state)
{
    synchronized(myboollock)
     {
          ab = state;
     }
}

public boolean getAB()
{
 synchronized(myboollock)
 {
         return ab;
 }
}
Run Code Online (Sandbox Code Playgroud)

我需要线程保护布尔值,这就是全部,并且过去使用过后面的方法,但是想开始使用Atomic对象,(如果)它们是安全的吗?

Jon*_*eet 6

如果所有你想要做的就是获取和设置一个boolean值原子,然后是-你可以使用AtomicBoolean,而不是没有任何同步。

当然,它synchronized允许更广泛的用途,例如在块中执行多个动作而不会丢失锁,或将其用于等待/通知。因此,这不是同步AtomicBoolean一般替代方法-但是在这种情况下,您可以使用它代替同步。


ass*_*ias 6

存在一些细微的差别,但从外部看,两个代码片段的行为类似:如果调用该set方法,则get随后调用的其他线程将看到更改.

主要区别是:

  • 性能:根据争用程度,您可以使用synchronized或获得更好的性能AtomicBoolean
  • 原子性:如果在某个阶段你想要做的不仅仅是设置布尔值,一个synchronized块将允许你以原子方式添加指令但AtomicBoolean不会