成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

AtomicLong.lazySet 是如何工作的?

CoderStudy / 2366人閱讀

摘要:上有人提問(wèn)是如何工作的答道為一個(gè)對(duì)象設(shè)置一個(gè)值,會(huì)確保其他線程讀取到最新值,原子類(lèi)和變量也是一樣的,這是由依賴于硬件的系統(tǒng)指令如的實(shí)現(xiàn)的。深入查看你會(huì)發(fā)現(xiàn)其實(shí)他們是相同的,是一個(gè)的包裝。這里是里關(guān)于如何獲得裝配的一個(gè)描述。

Quora上有人提問(wèn)AtomicLong.lazySet是如何工作的?

Jackson Davis答道:

  

為一個(gè)AtomicLong對(duì)象設(shè)置一個(gè)值,jvm會(huì)確保其他線程讀取到最新值,原子類(lèi)和voliatile變量也是一樣的,這是由依賴于硬件的系統(tǒng)指令(如x86的xchg)實(shí)現(xiàn)的。lazySet卻是無(wú)法保證這一點(diǎn)的方法,所以其他線程在之后的一小段時(shí)間里還是可以讀到舊的值。這有什么好處呢?性能:在多核處理器下,內(nèi)存以及cpu緩存的讀和寫(xiě)常常是順序執(zhí)行的,所以在多個(gè)cpu緩存之間同步一個(gè)內(nèi)存值的代價(jià)是很昂貴的。

  

如何實(shí)現(xiàn)呢?大多數(shù)的原子類(lèi),比如AtomicLong本質(zhì)上都是一個(gè)Unsafe和一個(gè)volatile Long變量的包裝類(lèi)。值得注意的是AtomicLong.lazySet方法實(shí)際是調(diào)用了本地方法Unsafe.putOrderedLong,本地方法Unsafe.putOrderedLong的實(shí)現(xiàn)可以參考http://hg.openjdk.java.net/jdk7/…。從Unsafe的代碼中可以發(fā)現(xiàn)Unsafe_setOrderedLong是一個(gè)本地方法(c++實(shí)現(xiàn)),它僅調(diào)用了SET_FIELD_VOLATILE,這很是奇怪,我們期望共享的Unsafe_setLongVolatile擁有不同的語(yǔ)義。PS:在非增強(qiáng)版本中,setOrdered僅僅是調(diào)用了setVolatile方法,很是讓人失望。深入查看你會(huì)發(fā)現(xiàn)其實(shí)他們是相同的,SET_FIELD_VOLATILE是一個(gè)OrderAccess:release_store_fence的包裝。可以在Linux x86的代碼http://hg.openjdk.java.net/jdk7/…中找到此方法的實(shí)現(xiàn),在64bit x86系統(tǒng)中采用xchgq來(lái)代碼,64位版本指令的問(wèn)題我上面有提到過(guò),上火。

  

ps:從理論上講lazySet能比一個(gè)標(biāo)準(zhǔn)的volatile變量的寫(xiě)性能更好。但是我在openJdk里沒(méi)有找到相關(guān)代碼。

Felix Sulima補(bǔ)充道:

  

sun.misc.unsafe很多方法被jvm增強(qiáng)了,JIT(just in time運(yùn)行時(shí)編譯執(zhí)行的技術(shù))直接解釋而忽略原始的實(shí)現(xiàn)??梢栽谶@里找到這個(gè)例子:src/share/vm/classfile/vmSymbols.hpp@3facbb14e873列表中的native方法僅僅是非JIT環(huán)境下的一個(gè)備份的內(nèi)部方法。例如,如果它沒(méi)有被調(diào)用(我也不知道是什么原因),因此這些方法缺乏一些必要的優(yōu)化。從Talk from JAX London的幻燈片11-12可以看到AtomicLong.lazySet(…)在x86系統(tǒng)上會(huì)被編譯成“mov”指令。這里是Google Group里關(guān)于如何獲得JIT裝配的一個(gè)描述。


原文 How-does-AtomicLong-lazySet-work
翻譯 孫文強(qiáng)

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/64018.html

相關(guān)文章

  • JavaScript 如何工作系列文章已更新到22篇

    摘要:為了方便大家共同學(xué)習(xí),整理了之前博客系列的文章,目前已整理是如何工作這個(gè)系列,可以請(qǐng)猛戳博客查看。以下列出該系列目錄,歡迎點(diǎn)個(gè)星星,我將更友動(dòng)力整理理優(yōu)質(zhì)的文章,一起學(xué)習(xí)。 為了方便大家共同學(xué)習(xí),整理了之前博客系列的文章,目前已整理 JavaScript 是如何工作這個(gè)系列,可以請(qǐng)猛戳GitHub博客查看。 以下列出該系列目錄,歡迎點(diǎn)個(gè)星星,我將更友動(dòng)力整理理優(yōu)質(zhì)的文章,一起學(xué)習(xí)。 J...

    lx1036 評(píng)論0 收藏0
  • JavaScript 如何工作:JavaScript 內(nèi)存模型

    摘要:調(diào)用堆棧是存放原始數(shù)據(jù)類(lèi)型的地方除了函數(shù)調(diào)用之外。上一節(jié)中聲明變量后調(diào)用堆棧的粗略表示如下。解釋改變的正確方法是更改內(nèi)存地址。在聲明時(shí),將在調(diào)用堆棧上分配內(nèi)存地址,該值是在堆上分配的內(nèi)存地址。 這是專(zhuān)門(mén)探索 JavaScript 及其所構(gòu)建的組件的系列文章的第 21 篇。 想閱讀更多優(yōu)質(zhì)文章請(qǐng)猛戳GitHub博客,一年百來(lái)篇優(yōu)質(zhì)文章等著你! 如果你錯(cuò)過(guò)了前面的章節(jié),可以在這里找到它們:...

    baoxl 評(píng)論0 收藏0
  • 追尋終極數(shù)據(jù)庫(kù) - 事務(wù)/分析混合處理系統(tǒng)交付挑戰(zhàn) (4)(完結(jié)篇)

    摘要:評(píng)估選項(xiàng)本報(bào)告涵蓋了為了支持工作負(fù)載涵蓋運(yùn)營(yíng)和分析,查詢引擎面臨的挑戰(zhàn)的細(xì)節(jié),這些細(xì)節(jié)也可以作為訪問(wèn)數(shù)據(jù)庫(kù)引擎查詢引擎和存儲(chǔ)引擎組合以及滿足事務(wù)運(yùn)營(yíng)分析或混合工作負(fù)載需求的指南。 評(píng)估HTAP選項(xiàng) 本報(bào)告涵蓋了為了支持工作負(fù)載(涵蓋OLTP、運(yùn)營(yíng)、BI和分析),查詢引擎面臨的挑戰(zhàn)的細(xì)節(jié),這些細(xì)節(jié)也可以作為訪問(wèn)數(shù)據(jù)庫(kù)引擎、查詢引擎和存儲(chǔ)引擎組合以及滿足事務(wù)、運(yùn)營(yíng)、分析或混合工作負(fù)載需求的...

    nanchen2251 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<