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很少.