可能是重复问题:
.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
和初始值(false)就足够了。这两个代码路径只是轻微的变化。 - H H