Re: [問題] volatile這個該死的修飾詞到底是幹嘛用的

看板java作者 (全新開始)時間13年前 (2011/04/18 14:57), 編輯推噓4(401)
留言5則, 5人參與, 最新討論串2/2 (看更多)
※ 引述《pzyc79 (English Idiot 簡稱EI)》之銘言: 推你的研究精神! 學程式就該這樣做 這個問題我曾經花一個暑假仔細研究過,並寫了一系列文章供人參考︰ http://eoffice.im.fju.edu.tw/phpbb/viewtopic.php?t=6280 你可以參考 volatile 那小節 : 如題 : 我已經找過google、javaworld都找不到滿意的答案 : 要嘛就是說他是什麼強制Thread不能用內存要去讀記憶體 沒範例 : 要嘛就是有簡單的程式範例 但是我實作結果又跟說的不一樣 : 1.class Test { : 2. static volatile int i = 0, j = 0; : 3. static void one() { i++; j++; } : 4. static void two() { : 5. System.out.println("i=" + i + " j=" + j); : 6. } : 7.} : 這個 : 他說i和j會同時更新 但是印出來i和j還是會不一樣啊 如果有文獻跟你講上面例子的變數用 volatile 修飾過可以讓 i 和 j 印出來一樣 那個資料可以直接丟了!!!這根本和 volatile 沒什麼直接關係!! 在概念解釋之前,你要先知道,JVM 不是單指一支擺在 Oracle 官網供你下載的程式 JVM 只是一個執行 Java bytecode 的軟體規格。 凡是有照規格做出來可以執行 java bytecode 的程式都算是 JVM, 你 JVM 的能力可以做得跟規格一樣,也可以做得比規格書要求的更多 原始官方 JVM 規格對 volatile 修飾字的要求很簡單,大意就只有這樣︰ 「不同執行緒對 volatile 修飾過的變數存取之間要存在 happens-before 關係」 至於什麼是 happens-before? 因為官網解釋又臭又長還不直觀, 我簡單精簡成一個重點︰ 「讀取 volatile 變數的執行緒,要能讀得到最後更新的值。」 只要那個 JVM 能讓 volatile 變數達到上述效果,就符合規格啦~ volatile 修飾字的效果,也就僅僅這樣而已~ 就算你再怎麼不解,規格書上定義的效果也就只有這樣.... : 這個 : 他說如果不用volatile會導致無限循環 可是明明不寫volatile呼叫tellMeStop : 他還是會停下來阿 : 到底是怎樣我快瘋了 這個問題,我覺得是因為現在 JVM 做的遠比規格還要多 老實說,要用現在的 JVM 跑程式證明多執行緒下, 變數有沒有 volatile 修飾究竟差在哪,還真是難~~ 我寫過很多程式想證明這件事,卻發現總是很難分離其他影響因素. 例如常常一不小心為了用不同變數比較執行效果,就跟 synchronized 混在一起了。 問題是規格書也要求 synchronized 區域裡面的變數要有 happens-before 關係, 一旦混在一起,根本就沒辦法證明 happens-before 效果究竟是從哪個語法來的。 而且有時候 JVM 似乎會自動幫你解決這些 memory inconsistency 的問題, 這讓我們更是感覺不到 volatile 究竟是什麼,它又在幹麻.... 你現在的情境就好像是拿不完全正確的 html 語法去給瀏覽器跑, 結果卻發現還是有畫面一樣.... 雖然語法有一些可能會造成問題的點,但因為瀏覽器做的比規格要求的還多, 所以最後還是能顯示.... 至於你提到的暫存器問題,那只是底層為了做到 volatile 規格定義的效果所做的 一些事,其實重點不是底層究竟做了哪些事,而是 volatile 究竟有什麼效果 這部分才是學語言該聚焦的地方 你現在會看到那些不知所云的資料,多半因為它想用底層的實作方式解釋 volatile 定義的效果....但這教法只有說給那些學過底層的人聽才合適 這就像是剛學程式語言,不懂 class 是什麼概念的人,解答的人卻用一堆底層的 細節來說明,只是徒增聽者的困擾而已.... -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.136.155.111

04/18 15:28, , 1F
用恐龍本的說法,volatile會讓存取變數變atomically囉?
04/18 15:28, 1F
※ 編輯: dream1124 來自: 140.136.160.132 (04/18 16:46)

04/19 08:14, , 2F
回一樓,是的。所以可以代替synchonized昂貴的lock/unlock
04/19 08:14, 2F

04/19 21:52, , 3F
推這篇文章,感謝大大一個暑假的心得分享:)
04/19 21:52, 3F

04/20 21:52, , 4F
我以前也是知道volatile功能但卻找不到code來驗證他
04/20 21:52, 4F

05/06 10:54, , 5F
推好文
05/06 10:54, 5F
文章代碼(AID): #1Dg-3Ifb (java)
文章代碼(AID): #1Dg-3Ifb (java)