我试图独占访问或使用单独的锁定对象的同一个对象上的c#-lock()?
作者:互联网
private class MyClass
{
private static MyObject myObject = new MyObject();
private void ModifyObject()
{
lock(myObject)
{
myObject.UnsafeMethod();
}
}
}
可以锁定myObject吗?还是必须声明另一个专用的锁定对象?
解决方法:
很好,任何对象都足以充当存储锁状态的位置.
但是,在任何代码审查中,它都是一个强烈的危险信号,表明程序员在考虑错误的锁定方式. .NET中没有“锁定对象使其具有线程安全性”这样的东西.这个概念确实存在,这是许多学术研究的主题,称为STM或软件事务存储.但是.NET框架中对此丝毫没有丝毫支持.
您使用锁来阻止代码.危险代码,可以由多个线程执行,并且可以读取或写入变量.源代码文件中特定位置通常存在多个位置的代码.您使用锁来确保只有一个线程可以在这些特定位置同时执行代码.因此,锁定状态与代码段而非对象相关联.因此,应该需要一个专用对象来存储这些特定部分的锁定状态.您可以通过拥有这样一个专用的对象来表明自己知道自己在做什么,而不仅仅是选择自己放置的对象.强大的自我记录功能,使您更容易查看发生锁定的位置,因为您只需搜索锁定变量的名称即可.
标签:multithreading,locking,thread-safety,c,net 来源: https://codeday.me/bug/20191123/2066749.html