摘要:每個(gè)會(huì)緩存主存的共享變量,從而提高處理效率。為當(dāng)前緩存行加入緩存一致性協(xié)議。任何修改,其他線程是可見(jiàn)的。修飾的變量還是會(huì)緩存的,只是通過(guò)一系列處理保證了所有線程看到這個(gè)變量的值是一致的
java并發(fā)編程實(shí)戰(zhàn)對(duì)volatile的解釋就是:當(dāng)一個(gè)域聲明為valatile類型后,編譯器與運(yùn)行時(shí)會(huì)監(jiān)視這個(gè)變量:它是共享的,而且對(duì)它的操作不會(huì)與其他的內(nèi)存操作一起被重排序。volatile變量不會(huì)緩存在寄存器或者緩存在對(duì)其他處理器隱藏的地方。
表示呵呵噠。
官方解釋:如果一個(gè)字段被聲明成volatile,java線程內(nèi)存模型確保所有線程看到這個(gè)變量的值是一致的。1.jvm對(duì)volatile變量做了什么事情?
在volatile聲明的變量進(jìn)行寫(xiě)操作的時(shí)候,JVM干了一件事,在前面加上了Lock為前綴的匯編代碼。
我們先看下多處理器的高速緩存,再說(shuō)加Lock會(huì)發(fā)生什么。
每個(gè)CPU會(huì)緩存主存的共享變量,從而提高處理效率。所以共享變量在每個(gè)CPU上都會(huì)有一份緩存。
多處理器下,Lock為前綴的匯編代碼發(fā)生下面兩件事情。
1.讓當(dāng)前緩存行寫(xiě)回到主存中。
2.為當(dāng)前緩存行加入緩存一致性協(xié)議。(效果就是:其他處理器會(huì)將該緩存行置為失效)
MESI協(xié)議。確保多處理器下緩存是一致的。具體的協(xié)議內(nèi)容可以自行百度,監(jiān)聽(tīng)+廣播+狀態(tài)的控制去實(shí)現(xiàn)的。
4.針對(duì)volatile的內(nèi)存語(yǔ)義、內(nèi)存屏障這篇說(shuō)的很好,直接上連接了http://www.importnew.com/2786...
寫(xiě)的時(shí)候加了StroeLoad內(nèi)存屏障,StroeLoad基于Lock指令實(shí)現(xiàn)的,所以編譯后會(huì)有Lock為前綴的指令
以上說(shuō)明了volatile的可見(jiàn)性。任何修改,其他線程是可見(jiàn)的。同時(shí)也說(shuō)明的java并發(fā)編程實(shí)戰(zhàn)的解釋不準(zhǔn)確,甚至是錯(cuò)誤的。volatile修飾的變量還是會(huì)緩存的,只是通過(guò)一系列處理保證了所有線程看到這個(gè)變量的值是一致的
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/69033.html
摘要:引用逸出基于外部方法發(fā)布對(duì)象引出引用逸出問(wèn)題。并發(fā)編程實(shí)戰(zhàn)的提到私有構(gòu)造函數(shù)公共的工廠方法解決可能逸出的問(wèn)題。同理在構(gòu)造函數(shù)可以新建線程,當(dāng)不要。下面代碼就是錯(cuò)誤的可以在構(gòu)造函數(shù)中但是不要 java并發(fā)編程實(shí)戰(zhàn)的解釋,不夠詳細(xì),尤其this引用逸出讓人理解有些費(fèi)解,java并發(fā)編程實(shí)戰(zhàn)里面的內(nèi)容就直接拷貝過(guò)來(lái) 發(fā)布:使對(duì)象能夠在當(dāng)前作用域之外的代碼中使用 逸出:當(dāng)某個(gè)不該被發(fā)布的對(duì)象被...
摘要:常見(jiàn)的八大排序算法,他們之間關(guān)系如下被人忽視的面向?qū)ο蟮牧笤瓌t后端掘金前言作為文集的第一篇,我覺(jué)得有必要介紹一下大概的寫(xiě)作規(guī)劃。 Java多線程干貨系列—(四)volatile關(guān)鍵字| 掘金技術(shù)征文 - 掘金原本地址:Java多線程干貨系列—(四)volatile關(guān)鍵字博客地址:http://tengj.top/ 前言 今天介紹下volatile關(guān)鍵字,volatile這個(gè)關(guān)鍵字可能...
摘要:常見(jiàn)的八大排序算法,他們之間關(guān)系如下被人忽視的面向?qū)ο蟮牧笤瓌t后端掘金前言作為文集的第一篇,我覺(jué)得有必要介紹一下大概的寫(xiě)作規(guī)劃。 Java多線程干貨系列—(四)volatile關(guān)鍵字| 掘金技術(shù)征文 - 掘金原本地址:Java多線程干貨系列—(四)volatile關(guān)鍵字博客地址:http://tengj.top/ 前言 今天介紹下volatile關(guān)鍵字,volatile這個(gè)關(guān)鍵字可能...
摘要:結(jié)構(gòu)型模式適配器模式橋接模式裝飾模式組合模式外觀模式享元模式代理模式。行為型模式模版方法模式命令模式迭代器模式觀察者模式中介者模式備忘錄模式解釋器模式模式狀態(tài)模式策略模式職責(zé)鏈模式責(zé)任鏈模式訪問(wèn)者模式。 主要版本 更新時(shí)間 備注 v1.0 2015-08-01 首次發(fā)布 v1.1 2018-03-12 增加新技術(shù)知識(shí)、完善知識(shí)體系 v2.0 2019-02-19 結(jié)構(gòu)...
摘要:假設(shè)不發(fā)生編譯器重排和指令重排,線程修改了的值,但是修改以后,的值可能還沒(méi)有寫(xiě)回到主存中,那么線程得到就是很自然的事了。同理,線程對(duì)于的賦值操作也可能沒(méi)有及時(shí)刷新到主存中。線程的最后操作與線程發(fā)現(xiàn)線程已經(jīng)結(jié)束同步。 很久沒(méi)更新文章了,對(duì)隔三差五過(guò)來(lái)刷更新的讀者說(shuō)聲抱歉。 關(guān)于 Java 并發(fā)也算是寫(xiě)了好幾篇文章了,本文將介紹一些比較基礎(chǔ)的內(nèi)容,注意,閱讀本文需要一定的并發(fā)基礎(chǔ)。 本文的...
閱讀 3363·2021-10-13 09:40
閱讀 2601·2021-10-08 10:17
閱讀 4006·2021-09-28 09:45
閱讀 938·2021-09-28 09:35
閱讀 1819·2019-08-30 10:51
閱讀 2910·2019-08-26 12:11
閱讀 1655·2019-08-26 10:41
閱讀 3103·2019-08-23 17:10