AtomicBoolean在哪里锁?

时间:2013-07-02 05:30:27

标签: java locking synchronized atomicboolean

AtomicBoolean使用本机代码进行同步。它如何转换为java锁?

之间有什么区别:

AtomicBoolean a = new AtomicBoolean();
synchronized (a) {
   a.set(true);
}

VS

a.set(true)

我知道不需要synchronized(a),因为它本身将确保操作是原子的。但是锁定在同步(a)中是否与a.set(true)中的锁相同?

4 个答案:

答案 0 :(得分:4)

如果原子性(例如在set / get中),原子依赖于JVM,但在其他情况下依赖于sun.misc.Unsafe类。您可以在以下网址查看代码:

http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/concurrent/atomic/AtomicBoolean.java

值得一看:

http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/sun/misc/Unsafe.java#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;