lock变量应该声明为volatile吗?

Dor*_*hen 21 .net c# multithreading locking volatile

我有以下Lock声明:

private readonly object ownerLock_ = new object();

lock (ownerLock_)
{
}
Run Code Online (Sandbox Code Playgroud)

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

private readonly volatile object ownerLock_ = new object();
Run Code Online (Sandbox Code Playgroud)

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

来自MSDN:

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

Jon*_*eet 19

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

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

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