发布于 2012-07-17 21:02:42
如果您只在拥有锁的同时访问锁“保护”的数据,那么是的-使这些字段不稳定是多余的。您也不需要使ownerLock_
变量成为易失性变量。(您目前还没有展示lock
语句中的任何实际代码,这使得很难具体讨论-但我假设您实际上正在读取/修改lock
语句中的一些数据。)
volatile
应该很少在应用程序代码中使用。如果您希望对单个变量进行无锁访问,那么Interlocked
几乎总是更容易理解。如果你想要更多的无锁访问,我几乎总是会开始锁定。(或者尝试使用不可变的数据结构。)
我只希望在试图为线程构建更高级别抽象的代码中看到volatile
-例如,在第三方公共语言代码库中。对于真正了解.NET内存模型的专家来说,它确实是一个工具……他们中的很少,国际海事组织。
发布于 2012-07-18 01:20:13
如果某个东西是readonly
的,那么它就是线程安全的,句号。(嗯,差不多。专家也许能够弄清楚如何在lock
语句上获得NullReferenceException,但这并不容易。)使用readonly
,您不需要volatile
、Interlocked
或锁定。它是多线程的理想关键字,你应该尽可能的使用它。它非常适合锁对象,因为它最大的缺点(你不能改变值)无关紧要。
此外,虽然引用是不可变的,但引用的对象可能不是。这里有"new object()“,但如果它是一个List
或其他可变对象--而且不是线程安全的--您可能希望锁定引用(以及对它的所有其他引用,如果有的话),以防止对象同时在两个线程中更改。
https://stackoverflow.com/questions/11523003
复制相似问题