可能重複:
The need for volatile modifier in double checked locking in .NET此雙重檢查鎖是否需要volatile關鍵字才能起作用?
考慮下面的代碼片段,它可以由多個線程同時執行,將需要volatile關鍵字,以確保「真實值'connected
總是從內存中讀取而不是緩存? (假設Disconnect()
只會被調用一次(即如果它第一次不能正常工作,並且connected
的值被讀爲false,則不會再次嘗試))。
public class MyClass
{
private readonly object syncRoot = new object();
private bool connected;
public void Disconnect()
{
if (connected)
{
lock (syncRoot)
{
if (connected)
{
// log off here
// ...
connected = false;
}
}
}
}
public void Connect()
{
lock (syncRoot)
{
// blah
// blah
connected = true;
}
}
}
我的感覺是,如果使用雙重檢查鎖定,然後它需要被標記爲volatile因爲如果讀不正確的值是第一次,那麼它會認爲它實際上是斷開的,並不會進入鎖定語句。我也認爲在這種情況下,雙重檢查鎖定不合適/不會提供任何性能增益,只有正常的鎖才能完成這項工作。
我想有人來證實或否認這些想法。
我已經鏈接了一篇文章,我發現這篇文章對於更好地理解同步問題非常有幫助。簡短的回答是,'lock'語句隱式地在讀和寫上都創建了一個內存屏障,這實際上比volatile更強大。 http://www.albahari.com/threading/part4.aspx –
@亨克 - 感謝 - 它是相似的,但在這個問題它可以是一個空引用或可以是一個引用,但它不會被重新設置爲空。我將編輯此問題以添加Connect方法。 – GarethD
我投票重新提出了這個問題。這*不是*與雙重檢查的鎖定模式完全相同。這個代碼有兩個不同的執行路徑(通過不同的方法調用)*和*,可能會泄露的非託管資源正在運行,這使得這種分析方法變得更加複雜。我不相信'volatile'使得這個代碼安全。 –