[問題] 請問有記憶體不一致的好例子嗎?
請問一下,有人可以分享多執行緒程式記憶體內容不一致(資料存放位置不同,
造成讀取的執行緒未取得最後更新值)的範例嗎?
是這樣子的
我在撰寫一篇有關多執行緒的基礎介紹文章給系上學弟妹參考,
裡面會提到volatile修飾字。
為了比較經過volatile修飾的效果,希望能找到示範「記憶體內容不一致」的例子,
然後經過Volatile修飾之後得到正確的值。
我了解多執行緒範例程式很難寫,因此不會期望能找到100%機會展現這種問題的程式,
但還是希望出現機率可以超過10%,讓文章的讀者不用重試那麼多次。
除了上面的考慮之外,這個錯誤示範程式的內容最好不含synchronized修飾字。
原因是synchronized造成的效果太多種,難以讓讀者釐清問題。
此外還要盡可能不摻入其他類型的執行緒問題,例如Thread Interference,
但如果執行緒問題包含「JVM改變執行順序」就沒有關係,
畢竟這本來就是volatile要阻止的事情之一。
感覺要做到上述這點會比較困難。 Orz
目前看過的網路文章或是實體書中的例子,要不成功率極低,跑不出所以然。
要不就是摻入其他執行緒問題,這樣讀起來使我有種「他說那程式有問題,就是有問題,
他說了算,拿不出什麼證據」的感覺。
可是自己跳下去撰寫例子時,要不就是寫出安全的物件,
要不就是寫出含有一種以上不安全狀況的物件,真是有點傷腦筋
看過較合適的例子也只有這個:
http://java.sun.com/docs/books/jls/third_edition/html/classes.html#36930
可惜它的比較結果還是不夠明顯
請問有任何人可以提供合適的例子嗎? 謝謝大家幫忙囉
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 219.87.85.162
推
08/09 17:35, , 1F
08/09 17:35, 1F
推
08/09 17:36, , 2F
08/09 17:36, 2F
謝謝您的建議,他寫的例子雖然可能有包含記憶體不一致,
但主要問題還是執行緒互相干擾吧(Thread Interference)
這邊所謂「記憶體不一致」,指的是各執行緒存放資料位置不同(CPU快取、暫存器、
記憶體)造成修改變數之後,接續著讀取的執行緒未能取得最後更新的數值
推
08/09 17:56, , 3F
08/09 17:56, 3F
※ 編輯: dream1124 來自: 61.231.149.120 (08/09 21:16)