日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

java 内存同步_Java中的硬件事务性内存,或者为什么同步将再次变得很棒

發(fā)布時間:2023/12/3 java 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 内存同步_Java中的硬件事务性内存,或者为什么同步将再次变得很棒 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

java 內(nèi)存同步

總覽

硬件事務(wù)內(nèi)存有可能允許多個線程同時以推測方式訪問相同的數(shù)據(jù)結(jié)構(gòu),并使緩存一致性協(xié)議確定是否發(fā)生沖突。 HTM旨在為您提供細粒度鎖定的可伸縮性,粗粒度鎖定的簡單性以及幾乎沒有鎖定的性能。 如果JVM支持,則您的程序或庫是使用過程粒度鎖定編寫的,這意味著您的應(yīng)用程序只需很少的更改即可擴展到更多的內(nèi)核。

盡管在C和C ++中添加對此的支持并非易事,但可以在不更改字節(jié)碼的情況下添加對JVM生成的本機代碼的支持。

簡而言之,這可以允許許多線程以推測方式并發(fā)地執(zhí)行鎖的同步塊,甚至并發(fā)寫入,并且處理器可以確定這是否是問題,然后重復(fù)執(zhí)行該塊,直到?jīng)]有問題為止。

什么是硬件事務(wù)內(nèi)存,它將花費多少?

硬件事務(wù)性內(nèi)存已經(jīng)存在了一段時間,但直到最近才成為主流。 隨著英特爾為其第四代i3 / i5 / i7處理器(Haswell)和其E3-1200 v3(最多4核,一個插槽ATM)系列處理器中的某些處理器提供支持,新的基于Intel的計算機可廣泛使用。 可能是在今年下半年或明年,我們才能看到更多的核心,這意味著HTM將會真正發(fā)揮作用。 AFAIK,AMD計劃很快添加此功能。

順便說一句,Azul的Vega系統(tǒng)已經(jīng)使用了這項技術(shù)已有近十年的時間,我希望Azul最適合首先在JVM中實現(xiàn)該技術(shù)。

您將購買的硬件(也許已經(jīng)購買)將完成此任務(wù)。 許多新型號的筆記本電腦都具有Haswell處理器,因為它們顯著改善了功耗。

如何運作?

Java中經(jīng)常使用同步塊,以防萬一。 為了簡化代碼,這些鎖通常比最佳鎖要粗糙得多。例如,對于任何操作,Hashtable鎖整個對象/映射,而具有精細鎖定的ConcurrentHashMap鎖。 編寫細粒度鎖定很難正確,因此更容易出錯。 硬件事務(wù)存儲的目標是支持過程粒度鎖定,但要獲得精細粒度鎖定的好處。 這對于不優(yōu)化代碼的代碼特別有用。

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; }

您可能會想到這種情況

  • 只看地圖
  • 更新地圖,但是在不同的地方,例如不同的鍵。
  • 很少嘗試一次在兩個線程中更新同一密鑰。

您想要的是

  • 線程之間的并發(fā)執(zhí)行。
  • 與沒有鎖定的代碼相比,開銷很小。
  • CPU或JVM可以完成所有工作來優(yōu)化此功能,即您不必更改代碼。

如果沒有HTM,則即使大多數(shù)情況是讀取操作,同步塊也需要獲得鎖并強制執(zhí)行序列化訪問。

使用HTM,字節(jié)碼可以變成偽碼,像這樣

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 /線程修改過的任何緩存行。 如果不是,則所做的更改將被提交。 否則,將放棄所有更改,并且可以重復(fù)循環(huán)。

注意:回滾事務(wù)意味著撤消更改,甚至可能意味著回滾沒有明顯副作用的對象創(chuàng)建。 如果確實有副作用,則可以使用XABORT指令來觸發(fā)事務(wù)中止,并且需要運行后備代碼。

比較和交換限制為64位,這些事務(wù)的限制是多少?

限制是您可以在L1緩存中存儲的行數(shù)。 最多32 KB。 如果您有超線程,則可能只有一半,即16 KB。 同樣,L1緩存是8路關(guān)聯(lián)的,因此在最壞的情況下,散列到同一存儲桶的9條緩存行可能導(dǎo)致事務(wù)失敗。 (帶有超線程的情況更少)不過,它比CAS 64位或128位的2CAS高得多,并且靈活得多。

使用后退編寫此事務(wù)鎖定結(jié)構(gòu),以使用C之類的語言添加樣板和重復(fù)代碼。

結(jié)論

這種模式的優(yōu)點是可以將其應(yīng)用于已經(jīng)編譯并可以作為開源庫使用的Java代碼。 與需要進行大量修改才能利用此功能的C代碼不同,Java程序無需重新編譯即可利用HTM。 我們需要的是更改JVM。

注釋(對我之前所說的內(nèi)容進行了一些更正/澄清)

為了我; 我認為“酷”技術(shù)引起了廣泛的興趣,即使沒有證明廣泛的實用性。 我相信,在主流JVM中實現(xiàn)此功能將挑戰(zhàn)甚至是經(jīng)驗豐富的開發(fā)人員“了解”多線程編程的知識。

雖然某些Haswell處理器中提供了Intel TSX,但并非所有Haswell處理器中都提供了Intel TSX。 您應(yīng)該在ARK上與Haswell進行聯(lián)系,并查看Intel TSX-NI是Yes 。

已經(jīng)注意到,這對于調(diào)優(yōu)的代碼可能沒有太大的區(qū)別。 英特爾TSX的設(shè)計師Ravi Rajwar在QCon SF 2012上的主題為 “ 機械同情”的主題 是“英特爾的下一代微體系結(jié)構(gòu)代號Haswell ”。 如果您看一下第29頁,它向我暗示,細粒度的代碼無論如何都將在內(nèi)核之間很好地擴展,并且不會獲得太多收益。 TSX可能會幫助您的是逐步鎖定。

有關(guān)更多技術(shù)細節(jié),我建議您閱讀Gil Tene在機械同情小組上的帖子 。 與我見過的任何人相比,他在調(diào)優(yōu)JVM以支持HTM方面具有第一手經(jīng)驗。

參考資料

  • 投機鎖定:打破規(guī)模障礙(JAOO 2005),由阿祖爾( Azul)的吉爾·特內(nèi)(Gil Tene)撰寫。
  • Sun Microsystems的David Dice,Yossi Lev,Mark Moir,Daniel Nussbaum,Marek Olszewski 的商業(yè)硬件事務(wù)存儲實現(xiàn)的早期經(jīng)驗(2009年10月) 。
  • Wikipedia上的事務(wù)同步擴展
  • 基準:SiSoftware的Haswell的TSX和內(nèi)存事務(wù)處理吞吐量(HLE和RTM)
  • 享受來自英特爾的英特爾?事務(wù)同步擴展的樂趣
  • 事務(wù)性內(nèi)存支持:英特爾的speculative_spin_mutex
  • Johan De Gelas講解了Intel Haswell事務(wù)同步擴展 。

參考: Java中的硬件事務(wù)性內(nèi)存,或者為什么同步將變得涼爽 ,我們的JCG合作伙伴 Peter Lawrey在Vanilla Java博客上發(fā)表了文章。

翻譯自: https://www.javacodegeeks.com/2014/02/hardware-transactional-memory-in-java-or-why-synchronized-will-be-cool-again.html

java 內(nèi)存同步

總結(jié)

以上是生活随笔為你收集整理的java 内存同步_Java中的硬件事务性内存,或者为什么同步将再次变得很棒的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。