[英]Lock vs synchronized vs atomic variables vs volatile in java in terms of read-write atomicity, visibility and protection from reordering
[英]Atomicity - Lock Vs atomic Vs binary-semaphore - Performance
Monitor = mutex(lock) + 條件變量
每個 Java 對象都有一個監視器,遵循上述原則。
synchronized
關鍵字聲明對象的監視器(鎖定 + 條件變量)。
我的理解是,對於原子性,不需要條件變量,lock(mutex) 就足夠了。
為了保持內存區域的原子性,Java 提供了Lock 、 atomic package 和binary semaphore 。
對於原子性,哪種方法在性能方面更好?
這取決於訪問模式: synchronized(var) { ... }
使用起來最簡單,因為它不需要顯式解鎖,與ReentrantLock
不同。 這兩個是相同的: synchronized(var)
將在var
上獲取鎖,而Lock
將在“自身”上獲取鎖(可以這么說)。 但是ReentrantLock
允許您獲取擴展信息(有關更多信息,請參閱其javadoc : isHeldByCurrentThread()
和getHoldCount()
)。
在性能方面, ReentrantReadWriteLock
將在您寫入很少和讀取很多時提高性能(因為當您只讀取時不需要鎖定),但在獲取和釋放鎖時應格外小心,作為“可擁有的同步器”可能會使您的線程死鎖(讀取和寫入鎖的處理方式不同)。
但是,如果您要讀/寫的數據是“簡單類型”(如原子包 javadoc 中所述),您將通過使用AtomicInteger
等獲得最佳性能,因為它們使用特定的、優化的 CPU 指令集,例如作為 SSE* 集中的比較和交換。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.