日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無先后,達(dá)者為師

網(wǎng)站首頁 編程語言 正文

volatile保證可見性及重排序方法_相關(guān)技巧

作者:Mark_Zoe ? 更新時間: 2022-09-30 編程語言

一、JMM的內(nèi)存可見性保證

按程序類型,Java程序的內(nèi)存可見性保證可以分為下列3類:

單線程程序:單線程程序不會出現(xiàn)內(nèi)存可見性問題。編譯器、runtime和處理器會共同確保單線程程序的執(zhí)行結(jié)果與該程序在順序一致性模型中的執(zhí)行結(jié)果相同。

正確同步的多線程程序:正確同步的多線程程序的執(zhí)行將具有順序一致性(程序的執(zhí)行結(jié)果與該程序在順序一致性內(nèi)存模型中的執(zhí)行結(jié)果相同)。這是JMM關(guān)注的重點(diǎn),JMM通過限制編譯器和處理器的重排序來為程序員提供內(nèi)存可見性保證。

未同步/未正確同步的多線程程序:JMM為它們提供了最小安全性保障:線程執(zhí)行時讀取到的值,要么是之前某個線程寫入的值,要么是默認(rèn)值未同步程序在JMM中的執(zhí)行時,整體上是無序的,其執(zhí)行結(jié)果無法預(yù)知。 JMM不保證未同步程序的執(zhí)行結(jié)果與該程序在順序一致性模型中的執(zhí)行結(jié)果一致。

二、volatile的內(nèi)存語義

1、volatile的特性

可見性:對一個volatile變量的讀,總是能看到(任意線程)對這個volatile變量最后的寫入。

原子性:對任意單個volatile變量的讀/寫具有原子性,但類似于volatile++這種復(fù)合操作不具有原子性(基于這點(diǎn),我們通過會認(rèn)為volatile不具備原子性)。volatile僅僅保證對單個volatile變量的讀/寫具有原子性,而鎖的互斥執(zhí)行的特性可以確保對整個臨界區(qū)代碼的執(zhí)行具有原子性。

有序性:對volatile修飾的變量的讀寫操作前后加上各種特定的內(nèi)存屏障來禁止指令重排序來保障有序性。

volatile 寫-讀的內(nèi)存語義:

當(dāng)寫一個volatile變量時,JMM會把該線程對應(yīng)的本地內(nèi)存中的共享變量值刷新到主內(nèi)存。

當(dāng)讀一個volatile變量時,JMM會把該線程對應(yīng)的本地內(nèi)存置為無效,線程接下來將從主內(nèi)存中讀取共享變量。

2、volatile可見性實(shí)現(xiàn)原理

JMM內(nèi)存交互層面實(shí)現(xiàn):volatile修飾的變量的read、load、use操作和assign、store、write必須是連續(xù)的,即修改后必須立即同步回主內(nèi)存,使用時必須從主內(nèi)存刷新,由此保證volatile變量操作對多線程的可見性。

硬件層面實(shí)現(xiàn):通過lock前綴指令,會鎖定變量緩存行區(qū)域并寫回主內(nèi)存,這個操作稱為“緩存鎖定”,緩存一致性機(jī)制會阻止同時修改被兩個以上處理器緩存的內(nèi)存區(qū)域數(shù)據(jù)。一個處理器的緩存回寫到內(nèi)存會導(dǎo)致其他處理器的緩存無效。

三、指令重排序

Java語言規(guī)范規(guī)定JVM線程內(nèi)部維持順序化語義。即只要程序的最終結(jié)果與它順序化情況的結(jié)果相等,那么指令的執(zhí)行順序可以與代碼順序不一致,此過程叫指令的重排序。指令重排序的意義:JVM能根據(jù)處理器特性(CPU多級緩存系統(tǒng)、多核處理器等)適當(dāng)?shù)膶C(jī)器指令進(jìn)行重排序,使機(jī)器指令能更符合CPU的執(zhí)行特性,最大限度的發(fā)揮機(jī)器性能。在編譯器與CPU處理器中都能執(zhí)行指令重排優(yōu)化操作。

JMM內(nèi)存屏障插入策略:

  • 在每個volatile寫操作的前面插入一個StoreStore屏障
  • 在每個volatile寫操作的后面插入一個StoreLoad屏障
  • 在每個volatile讀操作的后面插入一個LoadLoad屏障
  • 在每個volatile讀操作的后面插入一個LoadStore屏障

不同硬件實(shí)現(xiàn)內(nèi)存屏障的方式不同,Java內(nèi)存模型屏蔽了這種底層硬件平臺的差異,由JVM來為不同的平臺生成相應(yīng)的機(jī)器碼。

原文鏈接:https://juejin.cn/post/7127855190010495006

欄目分類
最近更新