[英]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類。 您可以在以下位置簽出代碼:
還值得一看:
盡管遺憾的是,它不是公共類,但它在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.