Tobias Lindaaker ( 新技術 )的演講“原子數據結構如何工作?” 在希爾頓的金門大橋3/4/5會議室區域舉行。 Lindaaker自從最初提交摘要以來就更改了演講標題 。 該摘要的標題(以及會議材料中列出的標題)是“原子數據結構如何工作?”,但他已將其重命名為“非阻塞數據結構如何工作?”。
Lindaaker解釋說,“原子”來自希臘語,意思是“不可分割的”。 他解釋說,“無鎖數據結構”是“在對數據結構執行操作(讀或寫)時不會阻塞任何線程的數據結構”。 他說,一個人要盡可能避免“ 等待旋轉 ”。
Lindaaker談到了同步區域。 他說,這些地區“通過代碼創建了序列化的路徑”和“保證安全的發布”。 他將“安全發布”定義為“退出同步[block]之前編寫的所有內容”和“保證在進入同步[block]時可見”。 他的項目符號之一說,“ 可變字段使您無需序列化即可安全地發布。” Lindaaker在他的“ volatile
字段”幻燈片中更加關注volatile
關鍵字修飾符。
幻燈片“什么是內存障礙?” 提供了內存屏障概念的簡單直觀表示。
Lindaaker在他的幻燈片“原子更新”中指出,訪問原子引用的最簡單方法是使用java.util.concurrent.atomic 。 AtomicReference <V> 。 Lindakker提供了使用杯墊的物理演示,以說明compareAndSet (如果條件有利地匹配,則設置一個值)與getAndSet之間的區別 。 (設置新值將返回舊值)。
Lindaaker更喜歡java.util.concurrent.atomic.AtomicReferenceFieldUpdater <T,V>,因為它的“較低的內存開銷”(“較少的對象標頭”)和“更好的內存局部性”(“無引用間接”)。
Lindaaker解釋說,基于陣列的隊列確實會阻塞(有時由于有限的硬件資源而需要限制工作量時,這是一個好處),鏈接的隊列不會阻塞。 Lindaaker以超市排隊為例。 在基于鏈接的隊列中,您始終站在隊列中前面同一客戶的后面。 在基于數組的隊列中,您始終保持在同一位置。 有界隊列“經常會表現更好”,但在充滿時會阻塞。
本演講的主題之一是學習新想法,然后逐一進行進一步研究的想法。 Lindaaker建議聽眾查看JDK的代碼,以查看一些令人印象深刻的代碼示例。
Lindaaker引用LMAX ( 倫敦多資產交易所 ) Disruptor作為“環形緩沖區”(“帶有讀標記和寫標記的陣列”)的示例。 他說,“讀者爭奪閱讀標記,作家爭奪書寫標記”,并強調了這樣的結果,“對于單一讀者/單一作家,沒有爭執。” Disruptor頁面將Disruptor描述為“高性能線程間消息傳遞庫”。
Lindaaker表示java.util.concurrent.ConcurrentHashMap是一個不錯的常規選擇,但是對于他的演示文稿中的討論并不十分令人興奮。 他說,通過適當的調整,它“可以在當前的商用硬件上合理擴展”(少于100個CPU)。
Neo Technology提供了非關系的數據庫實現( Neo4j )( 圖形數據庫 )。 Lindaaker將Neo Technology基于圖的數據庫描述為“將數據存儲為節點以及節點之間的關系”。
別忘了分享!
參考: JavaOne 2012:非阻塞數據結構如何工作? 由我們的JCG合作伙伴 Dustin Marx在Inspired by Actual Events博客中獲得。
翻譯自: https://www.javacodegeeks.com/2012/10/javaone-2012-how-do-non-blocking-data.html