AtomicBoolean与同步块有什么区别

时间:2015-01-26 17:18:32

标签: 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;
 }
}

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

2 个答案:

答案 0 :(得分:6)

如果 all ,您尝试做的是获取并设置单个boolean值原子,然后是 - 您可以使用AtomicBoolean而无需任何同步。< / p>

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

答案 1 :(得分:6)

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

主要区别是:

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