咦,咋沒加volatile,變數也可見的呢?

2021-10-07 06:57:37 字數 926 閱讀 3373

本想今天覆習一下volatile的,結果在寫demo時,怎麼也達不到效果。還以為寫錯的呢。最後發現是 system.out.printlnr惹的禍。

我的demo如下:

定義乙個變數控制線程的中斷。

最初的demo是這樣的:

class

test1},

"thredname --1").

start()

;try

catch

(interruptedexception e)

num =1;

system.out.

println

(num);}

}

不成功後,又換成多執行緒

class

test1},

"thredname --"

+i).

start()

;}trycatch

(interruptedexception e)

test11.num =1;

system.out.

println

(test11.num);}

}class

test11

我靠,驚醒夢中人。

注釋掉果然是自己想要的結果了。

public

void

println

(string x)

}

咦,為啥加鎖會是變數可見呢。這個在乙個部落格中是這麼說的:

加鎖的含義不僅僅侷限於互斥行為,還包括記憶體可見性

執行緒執行互斥鎖**的過程:

ok ,找到原因。

總結:還是基礎弱,還是要多看書,多練習。

附錄:

C語言volatile用法,(沒閱讀,對錯未知)

volatile提醒編譯器它後面所定義的變數隨時都有可能改變,因此編譯後的程式每次需要儲存或讀取這個變數的時候,都會直接從變數位址中讀取資料。如果沒有volatile關鍵字,則編譯器可能優化讀取和儲存,可能暫時使用暫存器中的值,如果這個變數由別的程式更新了的話,將出現不一致的現象。下面舉例說明。在d...

關於DCL單例模式加volatile的問題

volatile禁止指令重排 public class singleton public static singleton getinstance return instance 當乙個執行緒進入開始在記憶體new物件空間的時候,因為cpu底層會進行指令重排,如果此時位元組碼發生先new 再 ast...

DCL到底需不需要加volatile關鍵字

首先答案是肯定的!public class singleton public static singleton getinstance return instance 為什麼加volatile?volatile其實有兩個作用 public class testbytes 位元組碼 0 aload 0...