volatile關(guān)鍵字

原子性操作:原子操作是不可分割的,在執(zhí)行完畢不會(huì)被任何其它任務(wù)或事件中斷。

值引用:簡(jiǎn)單類型的賦值,復(fù)制的是其副本,不是內(nèi)存地址。

volatile關(guān)鍵字用于聲明簡(jiǎn)單類型變量,如int、float、boolean等數(shù)據(jù)類型。如果這些簡(jiǎn)單數(shù)據(jù)類型聲明為volatile,對(duì)它們的操作就會(huì)變成原子級(jí)別的。但這有一定的限制。

如:n++;n=n+1; 原因:在操作n=n+1;經(jīng)歷了讀,添加,寫。這本身不是原子性操作的;

變量的值由自身的上一個(gè)決定時(shí),如n=n+1、n++等,volatile關(guān)鍵字將失效,只有當(dāng)變量的值和自身上一個(gè)值無關(guān)時(shí)對(duì)該變量的操作才是原子級(jí)別的,如n = m + 1,這個(gè)就是原級(jí)別的;

在 java 垃圾回收整理一文中,描述了jvm運(yùn)行時(shí)刻內(nèi)存的分配。其中有一個(gè)內(nèi)存區(qū)域是jvm虛擬機(jī)棧,每一個(gè)線程運(yùn)行時(shí)都有一個(gè)線程棧,

線程棧保存了線程運(yùn)行時(shí)候變量值信息。當(dāng)線程訪問某一個(gè)對(duì)象時(shí)候值的時(shí)候,首先通過對(duì)象的引用找到對(duì)應(yīng)在堆內(nèi)存的變量的值,然后把堆內(nèi)存

變量的具體值load到線程本地內(nèi)存中,建立一個(gè)變量副本,之后線程就不再和對(duì)象在堆內(nèi)存變量值有任何關(guān)系,而是直接修改副本變量的值,

在修改完之后的某一個(gè)時(shí)刻(線程退出之前),自動(dòng)把線程變量副本的值回寫到對(duì)象在堆中變量。這樣在堆中的對(duì)象的值就產(chǎn)生變化了。下面一幅圖

描述這寫交互

read and load 從主存復(fù)制變量到當(dāng)前工作內(nèi)存

use and assign? 執(zhí)行代碼,改變共享變量值

store and write 用工作內(nèi)存數(shù)據(jù)刷新主存相關(guān)內(nèi)容

其中use and assign 可以多次出現(xiàn)

但是這一些操作并不是原子性,也就是 在read load之后,如果主內(nèi)存count變量發(fā)生修改之后,線程工作內(nèi)存中的值由于已經(jīng)加載,不會(huì)產(chǎn)生對(duì)應(yīng)的變化,所以計(jì)算出來的結(jié)果會(huì)和預(yù)期不一樣

對(duì)于volatile修飾的變量,jvm虛擬機(jī)只是保證從主內(nèi)存加載到線程工作內(nèi)存的值是最新的

(對(duì)于在線程中n++來說)例如假如線程1,線程2 在進(jìn)行read,load 操作中,發(fā)現(xiàn)主內(nèi)存中count的值都是5,那么都會(huì)加載這個(gè)最新的值

在線程1堆count進(jìn)行修改之后,會(huì)write到主內(nèi)存中,主內(nèi)存中的count變量就會(huì)變?yōu)?

線程2由于已經(jīng)進(jìn)行read,load操作,在進(jìn)行運(yùn)算之后,也會(huì)更新主內(nèi)存count的變量值為6

導(dǎo)致兩個(gè)線程及時(shí)用volatile關(guān)鍵字修改之后,還是會(huì)存在并發(fā)的情況。

在Java內(nèi)存模型中,有main memory,每個(gè)線程也有自己的memory (例如寄存器)。為了性能,一個(gè)線程會(huì)在自己的memory中保持要訪問的變量的副本。這樣就會(huì)出現(xiàn)同一個(gè)變量在某個(gè)瞬間,在一個(gè)線程的memory中的值可能與另外一個(gè)線程memory中的值,或者main memory中的值不一致的情況。

一個(gè)變量聲明為volatile,就意味著這個(gè)變量是隨時(shí)會(huì)被其他線程修改的,因此不能將它c(diǎn)ache在線程memory中。

總結(jié):volatile告訴jvm, 它所修飾的變量不保留拷貝,直接訪問主內(nèi)存中的。

參考鏈接(也不算參考倒像直接復(fù)制的):

Java多線程初學(xué)者指南(6):慎重使用volatile關(guān)鍵字 - 李寧的極客世界 - BlogJava

java中volatile關(guān)鍵字的含義 - God Is Coder - 博客園

java中關(guān)鍵字volatile的作用 - 每天積累一點(diǎn) - ITeye技術(shù)網(wǎng)站

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • volatile 關(guān)鍵字解析 原文出處: 海子volatile 這個(gè)關(guān)鍵字可能很多朋友都聽說過,或許也都用過。在 ...
    常青大俠閱讀 661評(píng)論 0 4
  • 此文章出自:<a href="http://www.cnblogs.com/dolphin0520/p/39203...
    zlb閱讀 731評(píng)論 0 6
  • TCP/IP只是一個(gè)協(xié)議棧,就像操作系統(tǒng)的運(yùn)行機(jī)制一樣,必須要具體實(shí)現(xiàn),同時(shí)還要提供對(duì)外的操作接口。這個(gè)就像操作系...
    ghbsunny閱讀 1,817評(píng)論 0 0
  • 一年級(jí)的語(yǔ)文真的不是想象中的那么簡(jiǎn)單。 劉同學(xué)讀拼音,常常犯的錯(cuò)誤有g(shù)_a,ka;zh_u_a,g...
    雄爸天下閱讀 1,123評(píng)論 0 1
  • 在2016年歲末有什么值得全民熱議與狂歡的事情呢?不得不提的是天后王菲闊別六年的演唱會(huì)。 12月30日晚上王菲以一...
    立夏的西瓜閱讀 4,946評(píng)論 12 44

友情鏈接更多精彩內(nèi)容