锁定变量应该声明为volatile吗?

我有以下Lock声明:

private readonly object ownerLock_ = new object(); lock (ownerLock_) { } 

我应该为我的锁变量使用volatile关键字吗?

 private readonly volatile object ownerLock_ = new object(); 

在MSDN上我看到它通常用于没有锁定访问的字段,所以如果我使用Lock我不需要使用volatile?

来自MSDN :

volatile修饰符通常用于多个线程访问的字段,而不使用lock语句来序列化访问。

如果您在拥有锁时访问锁定“守卫”的数据,那么是 – 使这些字段变得多余是多余的。 您也不需要将ownerLock_变量设置为volatile。 (你当前没有在lock语句中显示任何实际代码,这使得很难用具体的术语来讨论 – 但我假设你实际上是在读取/修改lock语句中的一些数据。)

volatile应该很少用在应用程序代码中。 如果您想要对单个变量进行无锁访问,则Interlocked几乎总是更容易理解。 如果你想在此之外进行无锁访问,我几乎总是会开始锁定。 (或者尝试使用不可变数据结构开始。)

我只希望在代码中看到volatile ,它试图为线程构建更高级别的抽象 – 例如,在TPL代码库中。 对于真正理解.NET内存模型的专家来说,它真的是一个工具……对于那些人很少,IMO。

如果某些东西是readonly它是线程安全的,期间。 (好吧,差不多。专家可能能够弄清楚如何在你的lock语句中获得NullReferenceException,但这并不容易。)使用readonly你不需要volatileInterlockedlock 。 它是multithreading的理想关键字,您应该尽可能地使用它。 它对锁定对象很有用,它的最大缺点(你不能改变它)无关紧要。

此外,虽然引用是不可变的,但引用的对象可能不是。 “new object()”在这里,但如果它是一个List或其他可变的东西 – 而不是线程安全的 – 你想要锁定引用(以及对它的所有其他引用,如果有的话)来保持对象从一次改变两个线程。