我繼續在使用雙重檢查鎖定的代碼上運行,並且我仍然對爲什麼使用它而感到困惑。爲什麼選擇雙重鎖定?
我最初並不知道double-checked locking is broken,當我知道它時,它爲我放大了這個問題:人們爲什麼首先使用它?不比較和交換更好?
if (field == null)
Interlocked.CompareExchange(ref field, newValue, null);
return field;
(我的問題適用於C#和Java,但上面的代碼是C#)。
是否雙重檢查鎖定有某種先天優勢相比,原子操作?
我不認爲你的問題可以有確切的答案,除了那些人可能沒有聽說過它被打破,而且雙重檢查鎖定是一個半顯而易見的天真的解決方案,以規避性能點擊同步... – 2011-05-23 04:17:16
@Merlyn:但它仍然是壞的?我認爲它在某些版本的Java中已被修復(編輯:從JDK5開始,如果你也使用'volatile',它顯然是有效的),並且我仍然看到代碼... – Mehrdad 2011-05-23 04:18:27
@Mehrdad:http://stackoverflow.com/問題/ 394898 /雙檢鎖式網/ 394932#394932。儘管如此,如果我有另一種選擇,我不會使用習慣用語來打破某些版本的「便攜式」語言。我不知道原子操作的性能(或者說關於那個級別的代碼,真的;)),但我認爲它比鎖定更好,並且可能允許多個線程繼續。 – 2011-05-23 04:21:43