AtomicBoolean vs Synchronized 块,有什么区别

AtomicBoolean vs Synchronized block, whats the difference

我正在尝试了解以下两个代码块之间的区别

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;
 }
}

我需要线程保护一个布尔值,仅此而已,并且有 以前用过后面的方法,但想开始用Atomic 对象,(如果)它们是安全的?,

如果 all 您尝试做的是获取和设置单个 boolean 值原子,那么是的 - 您可以改用 AtomicBoolean没有任何同步。

当然,synchronized允许更广泛的用途,例如在块内执行多​​个操作而不会丢失锁,或者将其用于wait/notify。所以它不像 AtomicBoolean 是同步的 一般 替代品 - 但在这种情况下,您可以使用它而不是同步。

有一些细微差别,但从外部看,这两个代码片段的行为相似:如果您调用 set 方法,则更改将对随后调用 get 的其他线程可见。

主要区别是:

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