首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >锁变量应该声明为易失性吗?

锁变量应该声明为易失性吗?
EN

Stack Overflow用户
提问于 2012-07-17 20:58:44
回答 2查看 5.4K关注 0票数 22

我有以下Lock语句:

代码语言:javascript
复制
private readonly object ownerLock_ = new object();

lock (ownerLock_)
{
}

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

代码语言:javascript
复制
private readonly volatile object ownerLock_ = new object();

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

来自MSDN

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-07-17 21:02:42

如果您只在拥有锁的同时访问锁“保护”的数据,那么是的-使这些字段不稳定是多余的。您也不需要使ownerLock_变量成为易失性变量。(您目前还没有展示lock语句中的任何实际代码,这使得很难具体讨论-但我假设您实际上正在读取/修改lock语句中的一些数据。)

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

我只希望在试图为线程构建更高级别抽象的代码中看到volatile -例如,在第三方公共语言代码库中。对于真正了解.NET内存模型的专家来说,它确实是一个工具……他们中的很少,国际海事组织。

票数 20
EN

Stack Overflow用户

发布于 2012-07-18 01:20:13

如果某个东西是readonly的,那么它就是线程安全的,句号。(嗯,差不多。专家也许能够弄清楚如何在lock语句上获得NullReferenceException,但这并不容易。)使用readonly,您不需要volatileInterlocked或锁定。它是多线程的理想关键字,你应该尽可能的使用它。它非常适合锁对象,因为它最大的缺点(你不能改变值)无关紧要。

此外,虽然引用是不可变的,但引用的对象可能不是。这里有"new object()“,但如果它是一个List或其他可变对象--而且不是线程安全的--您可能希望锁定引用(以及对它的所有其他引用,如果有的话),以防止对象同时在两个线程中更改。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11523003

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档