這個comparison of StampedLock and other locks顯示StampedLock是爭用上升速度最快的。然而,這和其他各種文章沒有列出爲什麼它更快。它似乎使用與其他類型的鎖相同的CAS語義?任何人都可以解釋爲什麼它是最快的爭用上升?
例如,在此代碼的下面,writeLock不僅阻塞其他writeLocks,還阻塞readLock。在這一點上,我並不關心樂觀的鎖等。只是簡單的writeLock ..什麼是優勢,它比ReentrantLock更快(再加上它甚至沒有可重入性)。爲什麼Java StampedLock比ReentrantReadWriteLock更快
3
A
回答
1
要明確的是,當爭用上升時,StampedLock的讀取速度更快。作家速度要快一些,但速度不及讀取速度快。我會解釋爲什麼。
大多數情況下,使用讀寫鎖定寫入的方式較少。但是,即使這樣,每次您在ReentrantReadWriteLock
上獲得readLock()
時,都必須增加讀卡器計數。這會強制使用此鎖的所有核心上的緩存失效。
在激烈的競爭中,這可能會導致讀取時顯着減慢。讀取應該很快,當做readLock()
時,我們不應該更新變量,這是違反直覺的。
如果相反,我們有一個郵票或讓我們說,版本?每次讀取迭代只更新一次。
對於我們來說,在競爭情況下,如果只有一個線程更新戳值(假設在寫入後),所有讀取線程將在想要讀取鎖時執行緩存命中。這將禁止高速緩存失效,並允許以比RRWL更合適的方式執行鎖定。
使用tryOptimisticRead
(如CAS)
- 獲取郵票
- 讀取值
- 先後郵票改變時使用
StampedLock
模式類似於無鎖算法?- 是的,再試一次或發出封鎖讀
- 不,我們很好,讓我們繼續前進。
相關問題
- 1. 什麼是Java中的StampedLock?
- 2. Java/Android什麼比ArrayList更快?
- 3. 爲什麼Java中的字符串比較(CompareTo)比C#更快?
- 4. 回聲爲什麼比打印更快?
- 5. 爲什麼BLE 4.2比BLE更快4.1
- 6. 爲什麼DataContract比Serializable更快?
- 7. 爲什麼Unix /終端比R更快?
- 8. 爲什麼order()比sort.list()更快?
- 9. 爲什麼A *比Dijkstra更快
- 10. 爲什麼Neo4j比SQL更快
- 11. 爲什麼file_get_contents()比使用fsock_open()更快?
- 12. DataTable爲什麼比DataReader更快
- 13. 爲什麼Core Data比SQLite更快
- 14. 爲什麼String.IsNullOrEmpty比String.Length更快?
- 15. 爲什麼VertexBuffer比DynamicVertexBuffer更快
- 16. 爲什麼const int比const int&更快?
- 17. 爲什麼Crystal比Ruby更快?
- 18. 爲什麼ConcurrentHashMap :: putIfAbsent比ConcurrentHashMap :: computeIfAbsent更快?
- 19. 爲什麼array.index比array.include更快?
- 20. 爲什麼float()比int()更快?
- 21. Python:爲什麼*和**比/和sqrt()更快?
- 22. 爲什麼emplace_back比push_back更快?
- 23. 爲什麼DataContractSerializer比xmlSerializer更快?
- 24. 爲什麼\%(\)在Vim中比\(\)更快?
- 25. 爲什麼SQL函數比UDF更快
- 26. 什麼比std :: pow更快?
- 27. 什麼比innerHTML更快?
- 28. 爲什麼Java反射調用比方法調用更快?
- 29. 爲什麼TOAD比我的java代碼更快?
- 30. 爲什麼b比b快?
嘿,約翰甚至StampedLock似乎可以用在readLock一些寫作..看到這個>> U.compareAndSwapLong(此,州,S,接下來= S + RUNIT) –
因此,約翰,也許只有偉大優化是tryOptimisticRead ..它以上面在步驟1,2,3中描述的方式使用。readLock和writeLock出現磨機運行。 –
這是正確的@ApurvaSingh,'tryOptimisticRead'是這裏真正有用的。 –