AtomicBoolean使用本机代码进行同步。它如何转换为java锁?
之间有什么区别:
AtomicBoolean a = new AtomicBoolean();
synchronized (a) {
a.set(true);
}
VS
a.set(true)
我知道不需要synchronized(a),因为它本身将确保操作是原子的。但是锁定在同步(a)中是否与a.set(true)中的锁相同?
答案 0 :(得分:4)
如果原子性(例如在set / get中),原子依赖于JVM,但在其他情况下依赖于sun.misc.Unsafe类。您可以在以下网址查看代码:
值得一看:
用于JDK中的许多东西,虽然遗憾的是它不是公共类。更加悲伤,因为它显然被命名为可以公开并且完全“安全”使用; - )
我应该补充一点,原子类的整个想法是避免锁和同步,这通常会提高性能。您不需要使用锁来保护它们,但可能依赖于compareAndSwap或incrementAndGet(对于数字)这样的操作,这些操作在使用锁时不是标准的。
答案 1 :(得分:1)
没有。 AtomicBoolean
,事实上,所有atomic classes都使用compare-and-swap来保证原子性。
答案 2 :(得分:0)
这样:
a.set(true);
根本没有内部同步,看看JDK 1.7中的AtomicBoolean.java代码(来自src.zip):
/**
* Unconditionally sets to the given value.
*
* @param newValue the new value
*/
public final void set(boolean newValue) {
value = newValue ? 1 : 0;
}
所以,是的,它与同步版本不同
答案 3 :(得分:0)
同步关键字根据JMM提供三种保证。 1.原子性 2.可见性 3.重新排序
但同步本质上是阻塞的。
java中的所有原子类,如AtomicInteger,AtomicLong,AtomicBoolean等 还提供以上三种保证。 但他们不会阻止其他线程。
他们提供 1.原子性 - 通过使用compareAndSwap操作。 2.可见性和重新排序 - 通过将基础变量声明为易失性来提供这些。
例如在AtomicInteger中,底层的int变量被声明为volatile
private volatile int value;