簡體   English   中英

AtomicBoolean鎖在哪里?

[英]AtomicBoolean where is the lock?

AtomicBoolean使用本機代碼進行同步。 它如何轉換成Java鎖?

之間有什么區別:

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

VS:

a.set(true)

我知道不需要synced(a),因為它本身可以確保操作是原子的。 但是,同步(a)中的鎖是否與a.set(true)中的鎖相同?

如果是原子性的話,例如在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或增量AndGet(用於數字)。

AtomicBoolean ,事實上,所有的原子類 ,使用比較並交換 ,以保證atomicitiy。

這個:

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;
}

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

同步關鍵字根據JMM提供三個保證。 1.原子性2.可見性3.重新排序

但是同步本質上是阻塞的。

Java中的所有Atomic類(例如AtomicInteger,AtomicLong,AtomicBoolean等)也提供上述三個保證。 但是它們不會阻塞其他線程。

他們提供1.原子性-通過使用compareAndSwap操作。 2.可見性和重新排序-這些是通過將基礎變量聲明為volatile來提供的。

例如在AtomicInteger中,將基本int變量聲明為volatile

private volatile int value;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM