24.volatile关键字的作用、volatile原理、可见性、内存屏障、volatile性能、transient
24.volatile關(guān)鍵字的作用
24.1.volatile原理
24.2.可見(jiàn)性
24.3.內(nèi)存屏障
24.4.volatile性能
25.transient
24.volatile關(guān)鍵字的作用
volatile在Java并發(fā)編程中常用于保持內(nèi)存可見(jiàn)性和防止指令重排序。
24.1.volatile原理
被volatile關(guān)鍵字修飾的變量,編譯器與運(yùn)行時(shí)都會(huì)注意到這個(gè)變量是共享的,因此不會(huì)將該變量上的操作與其他內(nèi)存操作一起重排序。volatile變量不會(huì)被緩存在寄存器或者對(duì)其他處理器不可見(jiàn)的地方,因此在讀取volatile類型的變量時(shí)總會(huì)返回最新寫(xiě)入的值。
在訪問(wèn)volatile變量時(shí)不會(huì)執(zhí)行加鎖操作,因此也就不會(huì)使執(zhí)行線程阻塞,因此volatile變量是一種比sychronized關(guān)鍵字更輕量級(jí)的同步機(jī)制。當(dāng)對(duì)非 volatile 變量進(jìn)行讀寫(xiě)的時(shí)候,每個(gè)線程先從內(nèi)存拷貝變量到CPU緩存中。如果計(jì)算機(jī)有多個(gè)CPU,每個(gè)線程可能在不同的CPU上被處理,這意味著每個(gè)線程可以拷貝到不同的 CPU cache中。
而聲明變量是 volatile 的,JVM 保證了每次讀變量都從內(nèi)存中讀,跳過(guò) CPU cache 這一步。
volatile在Java并發(fā)編程中常用于保持內(nèi)存可見(jiàn)性和防止指令重排序。內(nèi)存可見(jiàn)性(Memory Visibility):所有線程都能看到共享內(nèi)存的最新?tīng)顟B(tài);防止指令重排:在基于偏序關(guān)系的Happens-Before內(nèi)存模型中,指令重排技術(shù)大大提高了程序執(zhí)行效率,但同時(shí)也引入了一些問(wèn)題。
24.2.可見(jiàn)性
volatile保持內(nèi)存可見(jiàn)性的特殊規(guī)則:read、load、use動(dòng)作必須連續(xù)出現(xiàn);assign、store、write動(dòng)作必須連續(xù)出現(xiàn);每次讀取前必須先從主內(nèi)存刷新最新的值;每次寫(xiě)入后必須立即同步回主內(nèi)存當(dāng)中。
也就是說(shuō),volatile關(guān)鍵字修飾的變量看到的隨時(shí)是自己的最新值。在線程1中對(duì)變量v的最新修改,對(duì)線程2是可見(jiàn)的。
24.3.內(nèi)存屏障
volatile防止指令重排的策略:在每個(gè)volatile寫(xiě)操作的前面插入一個(gè)StoreStore屏障;在每個(gè)volatile寫(xiě)操作的后面插入一個(gè)StoreLoad屏障;在每個(gè)volatile讀操作的后面插入一個(gè)LoadLoad屏障;在每個(gè)volatile讀操作的后面插入一個(gè)LoadStore屏障。
24.4.volatile性能
volatile的讀性能消耗與普通變量幾乎相同,但是寫(xiě)操作稍慢,因?yàn)樗枰诒镜卮a中插入許多內(nèi)存屏障指令來(lái)保證處理器不發(fā)生亂序執(zhí)行。
25.transient
https://blog.csdn.net/u012723673/article/details/80699029
https://www.cnblogs.com/tiantanglw/p/9142895.html
總結(jié)
以上是生活随笔為你收集整理的24.volatile关键字的作用、volatile原理、可见性、内存屏障、volatile性能、transient的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 部队基层军医考公卫研究生前途怎么?
- 下一篇: 郑州市军人优待证云闪付坐地铁为啥刷不成?