2

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

有什么区别:

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

与:

a.set(true)

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

4

4 回答 4

4

原子性在某些情况下依赖于 JVM,例如在 set/get 中,但在其他情况下依赖于 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(用于数字)。

于 2013-07-02T05:35:05.807 回答
1

AtomicBoolean,事实上,所有的原子类都使用比较和交换来保证原子性。

于 2013-07-02T05:41:47.673 回答
0

同步关键字根据JMM提供三包。1. 原子性 2. 可见性 3. 重新排序

但同步本质上是阻塞的。

Java中的所有Atomic Classes如AtomicInteger、AtomicLong、AtomicBoolean等也提供了上述三个保证。但他们不会阻塞其他线程。

它们提供 1. 原子性 - 通过使用 compareAndSwap 操作。2. 可见性和重新排序——这些是通过将基础变量声明为 volatile 来提供的。

例如,在 AtomicInteger 中,底层 int 变量被声明为 volatile

private volatile int value;
于 2013-07-04T19:47:25.713 回答
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;
}

所以,是的,它与同步版本不同

于 2013-07-02T05:38:04.237 回答