Re: [問題] Volatile正確用法?

看板C_Sharp (C#)作者 (Ghostx2)時間12年前 (2013/06/16 21:39), 編輯推噓1(1010)
留言11則, 3人參與, 最新討論串2/2 (看更多)
另外問一下 在單例模式有些範例寫法會寫成如下 public class Singleton { private volatile static Singleton _instance = null; private static readonly object lockHelper = new object(); private Singleton(){} public static Singleton CreateInstance() { if(_instance == null) { lock(lockHelper) { if(_instance == null) _instance = new Singleton(); } } return _instance; } } 都已經用lock包住了 為什麼還需要volatile lock不就有屏蔽效果了 哪還需要volatile達到記憶體的屏蔽 謝謝! -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.41.238.99

06/17 14:34, , 1F
用synchronized感覺才不需要用lock
06/17 14:34, 1F

06/17 20:03, , 2F
這是 "double-checked locking is broken" 的問題
06/17 20:03, 2F

06/17 20:06, , 3F
在_inst=new ...()的同時,if(_inst==null)可能會錯誤判斷
06/17 20:06, 3F

06/17 20:08, , 4F
volatile是拿來避免這個問題的
06/17 20:08, 4F

06/17 20:09, , 5F
不過, 在 .NET 裡面, 因為 memory model 設計,
06/17 20:09, 5F

06/17 20:09, , 6F
所以不會遇到這樣的情況產生
06/17 20:09, 6F

06/17 20:10, , 7F
但是, 在 ECMA 標準或是其它 implement 下,
06/17 20:10, 7F

06/17 20:11, , 8F
不同CPU(x86/x64/IA-64)差異,就不能保證不會有這個問題
06/17 20:11, 8F

06/17 22:33, , 9F
我在MSDN Magazine有看到類似記憶體架構, 無奈實力不夠
06/17 22:33, 9F

06/17 22:34, , 10F
尚不能理解文章內容, 看到iterator講解後就比較淺顯易懂
06/17 22:34, 10F

06/17 22:35, , 11F
附上我看到的文章http://ppt.cc/SKkx
06/17 22:35, 11F
文章代碼(AID): #1HlR_uea (C_Sharp)
文章代碼(AID): #1HlR_uea (C_Sharp)