AtomicBoolean与同步块有什么区别
我试图理解以下两个代码块之间的区别
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对象,(如果)它们是安全的吗?
有一些细微的差别,但从外部看,两个代码片段的行为类似:如果你调用set
方法,那么随后调用get
其他线程可以看到更改。
主要区别是:
- 性能:根据争用程度,使用
synchronized
或AtomicBoolean
可以获得更好的性能 - primefaces性:如果在某个阶段你想要做的不仅仅是设置布尔值,
synchronized
块将允许你以primefaces方式添加指令但是AtomicBoolean
不会
如果您要做的就是获取并设置一个boolean
值primefaces,那么是 – 您可以使用AtomicBoolean
而无需任何同步。
当然, synchronized
允许更广泛的用途,例如在块内执行多个操作而不会丢失锁定,或者将其用于等待/通知。 所以它不像AtomicBoolean
是同步的一般替代品 – 但在这种情况下,您可以使用它而不是同步。