java 内存同步_Java中的硬件事务性内存,或者为什么同步将再次变得很棒
java 內存同步
總覽
硬件事務內存有可能允許多個線程同時以推測方式訪問相同的數據結構,并使緩存一致性協議確定是否發生沖突。 HTM旨在為您提供細粒度鎖定的可伸縮性,粗粒度鎖定的簡單性以及幾乎沒有鎖定的性能。 如果JVM支持,則您的程序或庫是使用過程粒度鎖定編寫的,這意味著您的應用程序只需很少的更改即可擴展到更多的內核。
盡管在C和C ++中添加對此的支持并非易事,但可以在不更改字節碼的情況下添加對JVM生成的本機代碼的支持。
簡而言之,這可以允許許多線程以推測方式并發地執行鎖的同步塊,甚至并發寫入,并且處理器可以確定這是否是問題,然后重復執行該塊,直到沒有問題為止。
什么是硬件事務內存,它將花費多少?
硬件事務性內存已經存在了一段時間,但直到最近才成為主流。 隨著英特爾為其第四代i3 / i5 / i7處理器(Haswell)和其E3-1200 v3(最多4核,一個插槽ATM)系列處理器中的某些處理器提供支持,新的基于Intel的計算機可廣泛使用。 可能是在今年下半年或明年,我們才能看到更多的核心,這意味著HTM將會真正發揮作用。 AFAIK,AMD計劃很快添加此功能。
順便說一句,Azul的Vega系統已經使用了這項技術已有近十年的時間,我希望Azul最適合首先在JVM中實現該技術。
您將購買的硬件(也許已經購買)將完成此任務。 許多新型號的筆記本電腦都具有Haswell處理器,因為它們顯著改善了功耗。
如何運作?
Java中經常使用同步塊,以防萬一。 為了簡化代碼,這些鎖通常比最佳鎖要粗糙得多。例如,對于任何操作,Hashtable鎖整個對象/映射,而具有精細鎖定的ConcurrentHashMap鎖。 編寫細粒度鎖定很難正確,因此更容易出錯。 硬件事務存儲的目標是支持過程粒度鎖定,但要獲得精細粒度鎖定的好處。 這對于不優化代碼的代碼特別有用。
例
private final Map map = new HashMap<>(); public synchronized PooledObject acquireObject(String key) {PooledObjectobject = map.get(key);if (object == null)map.put(key, object = new PooledObject());return map; }您可能會想到這種情況
- 只看地圖
 - 更新地圖,但是在不同的地方,例如不同的鍵。
 - 很少嘗試一次在兩個線程中更新同一密鑰。
 
您想要的是
- 線程之間的并發執行。
 - 與沒有鎖定的代碼相比,開銷很小。
 - CPU或JVM可以完成所有工作來優化此功能,即您不必更改代碼。
 
如果沒有HTM,則即使大多數情況是讀取操作,同步塊也需要獲得鎖并強制執行序列化訪問。
使用HTM,字節碼可以變成偽碼,像這樣
public PooledObject acquireObject(String key) {int code;do {xbegin();PooledObjectobject = map.get(key);if (object == null)map.put(key, object = new PooledObject());return map;} while((code = xend()) == RETRYABLE);if (code != DONE) {// take corrective action such as// obtain a normal lock and repeat} }XEND指令劃定了檢查緩存中的推測性讀集和寫集的終點,以查看其中是否有被其他CPU /線程修改過的任何緩存行。 如果不是,則所做的更改將被提交。 否則,將放棄所有更改,并且可以重復循環。
注意:回滾事務意味著撤消更改,甚至可能意味著回滾沒有明顯副作用的對象創建。 如果確實有副作用,則可以使用XABORT指令來觸發事務中止,并且需要運行后備代碼。
比較和交換限制為64位,這些事務的限制是多少?
限制是您可以在L1緩存中存儲的行數。 最多32 KB。 如果您有超線程,則可能只有一半,即16 KB。 同樣,L1緩存是8路關聯的,因此在最壞的情況下,散列到同一存儲桶的9條緩存行可能導致事務失敗。 (帶有超線程的情況更少)不過,它比CAS 64位或128位的2CAS高得多,并且靈活得多。
使用后退編寫此事務鎖定結構,以使用C之類的語言添加樣板和重復代碼。
結論
這種模式的優點是可以將其應用于已經編譯并可以作為開源庫使用的Java代碼。 與需要進行大量修改才能利用此功能的C代碼不同,Java程序無需重新編譯即可利用HTM。 我們需要的是更改JVM。
注釋(對我之前所說的內容進行了一些更正/澄清)
為了我; 我認為“酷”技術引起了廣泛的興趣,即使沒有證明廣泛的實用性。 我相信,在主流JVM中實現此功能將挑戰甚至是經驗豐富的開發人員“了解”多線程編程的知識。
雖然某些Haswell處理器中提供了Intel TSX,但并非所有Haswell處理器中都提供了Intel TSX。 您應該在ARK上與Haswell進行聯系,并查看Intel TSX-NI是Yes 。
已經注意到,這對于調優的代碼可能沒有太大的區別。 英特爾TSX的設計師Ravi Rajwar在QCon SF 2012上的主題為 “ 機械同情”的主題 是“英特爾的下一代微體系結構代號Haswell ”。 如果您看一下第29頁,它向我暗示,細粒度的代碼無論如何都將在內核之間很好地擴展,并且不會獲得太多收益。 TSX可能會幫助您的是逐步鎖定。
有關更多技術細節,我建議您閱讀Gil Tene在機械同情小組上的帖子 。 與我見過的任何人相比,他在調優JVM以支持HTM方面具有第一手經驗。
參考資料
- 投機鎖定:打破規模障礙(JAOO 2005),由阿祖爾( Azul)的吉爾·特內(Gil Tene)撰寫。
 - Sun Microsystems的David Dice,Yossi Lev,Mark Moir,Daniel Nussbaum,Marek Olszewski 的商業硬件事務存儲實現的早期經驗(2009年10月) 。
 - Wikipedia上的事務同步擴展
 - 基準:SiSoftware的Haswell的TSX和內存事務處理吞吐量(HLE和RTM)
 - 享受來自英特爾的英特爾?事務同步擴展的樂趣
 - 事務性內存支持:英特爾的speculative_spin_mutex
 - Johan De Gelas講解了Intel Haswell事務同步擴展 。
 
翻譯自: https://www.javacodegeeks.com/2014/02/hardware-transactional-memory-in-java-or-why-synchronized-will-be-cool-again.html
java 內存同步
總結
以上是生活随笔為你收集整理的java 内存同步_Java中的硬件事务性内存,或者为什么同步将再次变得很棒的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: vivo手机加速器设置(vivo手机的加
 - 下一篇: JDK 13:什么是Aggressive