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

資訊專欄INFORMATION COLUMN

理解Java中的Volatile關(guān)鍵字(demo)

codecraft / 2023人閱讀

摘要:現(xiàn)在的處理器,一般是會有多個的,每個線程可能運行在不同的,那么線程修改完成的值,是首先保存在中去??紤]這樣一種情況現(xiàn)在有兩個線程,線程和線程,他們不時會去讀取這個共享變量。

什么是volatile

關(guān)鍵字volatile 提供了Java 虛擬機中最輕量級的同步機制。在meidium 中有篇文章說:Volatile?specifier?is used to indicate that a?variable’s value can be modified by multiple?threads?simultaneously

當(dāng)你使用了volatile之后,那么這個變量會有如下的特性:

保證此變量對所有的線程的可見性

禁止指令重排序優(yōu)化

對于第一條的內(nèi)容,volatile是如何保證讀寫操作對所有的線程可見?

這里涉及到可見性的問題。

對于普通的變量來說,每個線程要想修改變量的值,首先從主存(JMM的定義,在JVM中,大致是可以對應(yīng)到堆內(nèi)存的)中拷貝值到自己所屬的CPU cache中去。現(xiàn)在的處理器,一般是會有多個CPU的,每個線程可能運行在不同的CPU, 那么線程修改完成的值,是首先保存在CPU cache中去。此時其他的線程是察覺不到修改的結(jié)果的,這就造成了并發(fā)模型中的可見性問題。

考慮這樣一種情況:

public class SharedObject { 
   public int counter = 0;
}

現(xiàn)在有兩個線程, 線程1和線程2, 他們不時會去讀取這個共享變量。如果counter沒有聲明volatile這個關(guān)鍵字,那么此時就無法保證counter的值何時從CPU緩存寫回到主存。這意味著,counter在CPU cache中的值和主存中的會不一致。

但是如果聲明了volatile的話,對volatile變量進行寫操作的話,那么JVM就會向處理器發(fā)送一條LOCK前綴的指令,將這個變量所在緩存行中的數(shù)據(jù)寫回到系統(tǒng)內(nèi)存。

寫回的過程,為了保證各個處理器的緩存是一一致的,就會實現(xiàn)緩存一致性協(xié)議。

緩存不停地窺探總線上發(fā)生的數(shù)據(jù)交換,來檢查自己的數(shù)據(jù)是不是已經(jīng)過期了。如果發(fā)現(xiàn)此時緩存行中的值已經(jīng)失效的話,就會將當(dāng)前緩存行中的值設(shè)置為無效狀態(tài)。處理器要用到這個值的話,就會從內(nèi)存中重新獲取這個值。

禁止指令重排序

指令重排序是指CPU采用了允許將多條指令不按照程序規(guī)定的順序分開發(fā)送給各相應(yīng)的電路單元處理

TODO --

參考:

https://blog.usejournal.com/j...

https://medium.com/@siddhusin...

https://www.cnblogs.com/dolph...

《Java特種兵》

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

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

相關(guān)文章

  • 《深入理解 Java 內(nèi)存模型》讀書筆記

    摘要:前提深入理解內(nèi)存模型程曉明著,該書在以前看過一遍,現(xiàn)在學(xué)的東西越多,感覺那塊越重要,于是又再細(xì)看一遍,于是便有了下面的讀書筆記總結(jié)。同步同步是指程序用于控制不同線程之間操作發(fā)生相對順序的機制。線程之間的通信由內(nèi)存模型控制。 showImg(https://segmentfault.com/img/remote/1460000013474312?w=1920&h=1271); 前提 《深...

    xuexiangjys 評論0 收藏0
  • 《深入理解 Java 內(nèi)存模型》讀書筆記

    摘要:前提深入理解內(nèi)存模型程曉明著,該書在以前看過一遍,現(xiàn)在學(xué)的東西越多,感覺那塊越重要,于是又再細(xì)看一遍,于是便有了下面的讀書筆記總結(jié)。同步同步是指程序用于控制不同線程之間操作發(fā)生相對順序的機制。線程之間的通信由內(nèi)存模型控制。 showImg(https://mmbiz.qpic.cn/mmbiz_jpg/1flHOHZw6RtPu3BNx3zps1JhSmPICRw7QgeOmxOfTb...

    姘存按 評論0 收藏0
  • 【J2SE】java并發(fā)基礎(chǔ)

    摘要:的線程機制是搶占式。會讓出當(dāng)多個線程并發(fā)的對主存中的數(shù)據(jù)進行操作時,有且只有一個會成功,其余均失敗。和對象只有在困難的多線程問題中才是必須的。 并發(fā)簡述 并發(fā)通常是用于提高運行在單處理器上的程序的性能。在單 CPU 機器上使用多任務(wù)的程序在任意時刻只在執(zhí)行一項工作。 并發(fā)編程使得一個程序可以被劃分為多個分離的、獨立的任務(wù)。一個線程就是在進程中的一個單一的順序控制流。java的線程機制是...

    tianyu 評論0 收藏0
  • java 關(guān)鍵字總結(jié)

    摘要:關(guān)鍵字總結(jié)有個關(guān)鍵字,它們是接下來對其中常用的幾個關(guān)鍵字進行概括。而通過關(guān)鍵字,并不能解決非原子操作的線程安全性。為了在一個特定對象的一個域上關(guān)閉,可以在這個域前加上關(guān)鍵字。是語言的關(guān)鍵字,用來表示一個域不是該對象串行化的一部分。 java 關(guān)鍵字總結(jié) Java有50個關(guān)鍵字,它們是: abstract do implements private ...

    honmaple 評論0 收藏0
  • 理解java Volatile 關(guān)鍵字

    摘要:最近在看多線程相關(guān),看到這篇來自大神關(guān)于關(guān)鍵字的講解感覺非常詳細(xì)易懂,特此轉(zhuǎn)載一下。如果對增加聲明則所有線程對的寫都會立即刷新到主存中,而且所有對的讀也都直接從主存中去讀。 最近在看java多線程相關(guān),看到這篇來自大神Jakob Jenkov關(guān)于Volatile關(guān)鍵字的講解感覺非常詳細(xì)易懂,特此轉(zhuǎn)載一下。原文鏈接:http://tutorials.jenkov.com/j... 內(nèi)存可...

    ConardLi 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<