Volatile關(guān)鍵字的效果

今天復(fù)習了下java內(nèi)存模型,原子性,可見性,有序性。以下是概念。


什么是原子性:
即一個操作或者多個操作 要么全部執(zhí)行并且執(zhí)行的過程不會被任何因素打斷,要么就都不執(zhí)行。
一個很經(jīng)典的例子就是銀行賬戶轉(zhuǎn)賬問題:?
比如從賬戶A向賬戶B轉(zhuǎn)1000元,那么必然包括2個操作:從賬戶A減去1000元,往賬戶B加上1000元。這2個操作必須要具備原子性才能保證不出現(xiàn)一些意外的問題。
我們操作數(shù)據(jù)也是如此,比如i = i+1;其中就包括,讀取i的值,計算i,寫入i。這行代碼在Java中是不具備原子性的,則多線程運行肯定會出問題,所以也需要我們使用同步和lock這些東西來確保這個特性了。?
原子性其實就是保證數(shù)據(jù)一致、線程安全一部分,

什么可見性

當多個線程訪問同一個變量時,一個線程修改了這個變量的值,其他線程能夠立即看得到修改的值。

若兩個線程在不同的cpu,那么線程1改變了i的值還沒刷新到主存,線程2又使用了i,那么這個i值肯定還是之前的,線程1對變量的修改線程沒看到這就是可見性問題。?

什么是有序性

程序執(zhí)行的順序按照代碼的先后順序執(zhí)行。

一般來說處理器為了提高程序運行效率,可能會對輸入代碼進行優(yōu)化,它不保證程序中各個語句的執(zhí)行先后順序同代碼中的順序一致,但是它會保證程序最終執(zhí)行結(jié)果和代碼順序執(zhí)行的結(jié)果是一致的。如下:

int a = 10; ???//語句1

int r = 2; ???//語句2

a = a + 3; ???//語句3

r = a*a; ????//語句4

則因為重排序,他還可能執(zhí)行順序為 2-1-3-4,1-3-2-4
但絕不可能 2-1-4-3,因為這打破了依賴關(guān)系。
顯然重排序?qū)尉€程運行是不會有任何問題,而多線程就不一定了,所以我們在多線程編程時就得考慮這個問題了。

Java內(nèi)存模型

共享內(nèi)存模型指的就是Java內(nèi)存模型(簡稱JMM),JMM決定一個線程對共享變量的寫入時,能對另一個線程可見。從抽象的角度來看,JMM定義了線程和主內(nèi)存之間的抽象關(guān)系:線程之間的共享變量存儲在主內(nèi)存(main memory)中,每個線程都有一個私有的本地內(nèi)存(local memory),本地內(nèi)存中存儲了該線程以讀/寫共享變量的副本。本地內(nèi)存是JMM的一個抽象概念,并不真實存在。它涵蓋了緩存,寫緩沖區(qū),寄存器以及其他的硬件和編譯器優(yōu)化。


從上圖來看,線程A與線程B之間如要通信的話,必須要經(jīng)歷下面2個步驟:

1. 首先,線程A把本地內(nèi)存A中更新過的共享變量刷新到主內(nèi)存中去。

2. 然后,線程B到主內(nèi)存中去讀取線程A之前已更新過的共享變量。


以下是2個對比例子:

package classForm;


public class VolatileDemo {
?public static void main(String[] args) throws InterruptedException {
??ThreadVolatileDemo t1 = new ThreadVolatileDemo();
??t1.start();
??Thread.sleep(300);
??t1.isRun(false);
?}
}

class ThreadVolatileDemo extends Thread{
?private volatile boolean flag=true;
?@Override
?public void run() {
??System.out.println("子線程開始運行");
??while(flag){
??}
??System.out.println("子線程結(jié)束運行");
?}
?public void isRun(boolean flag){
??this.flag = flag;
??System.out.println("ThreadVolatileDemo==>"+flag);
?}
}



以上總結(jié):例子中的flag是在子線程當中,主線程更新了子線程當中的flag的值,但是實際循環(huán)當中那個flag讀取的值是存在主線程當中的,volatile的作用就是將子線程當中被更新的flag強制刷新到主線程的flag當中,這樣其他線程訪問的時候就可以讀取到主線程當中最新的那個flag值了。


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

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

  • 此文章出自:<a href="http://www.cnblogs.com/dolphin0520/p/39203...
    zlb閱讀 755評論 0 6
  • 思念像船,船會溢,思念就會, 月亮像船,船會來,月亮就會。 感情像夢,夢一場,換來一場離合心酸, 笑容像夢,夢里夢...
    蘇汐揚閱讀 624評論 0 0
  • 人生如旅 來去匆匆
    一只北海的魚閱讀 229評論 5 5
  • 辭職至今已經(jīng)一個多月了,裸辭的后果大概就是現(xiàn)在這樣吧:簡歷像斷了線的風箏,只給人留下沉重的嘆息。 前不久,參加了春...
    琴人彌茶閱讀 374評論 4 5

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