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