Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 锁定()在同一对象I';我试图独占访问或使用单独的锁定对象?_C#_.net_Multithreading_Thread Safety_Locking - Fatal编程技术网

C# 锁定()在同一对象I';我试图独占访问或使用单独的锁定对象?

C# 锁定()在同一对象I';我试图独占访问或使用单独的锁定对象?,c#,.net,multithreading,thread-safety,locking,C#,.net,Multithreading,Thread Safety,Locking,可以锁定myObject吗?或者我必须声明另一个专用锁定对象吗?可以在要同步访问的对象上锁定只要您可以确保锁定它的所有代码都在您的控制之下(因为如果不是这样,理论上可能会有一些代码您不知道如何锁定同一个对象并导致死锁) 大多数情况下,您看到专用锁定对象正是因为这样:如果要修改已公开的集合(例如,通过属性),良好的实践表明,您不能锁定集合本身 在这种情况下,锁目标是私有的,因此如果您没有明确地将其暴露给外部世界,那么就可以了。很好,任何对象都可以充当存储锁状态的位置 然而,在任何代码审查中,这都是

可以锁定
myObject
吗?或者我必须声明另一个专用锁定对象吗?

可以在要同步访问的对象上锁定
只要您可以确保锁定它的所有代码都在您的控制之下(因为如果不是这样,理论上可能会有一些代码您不知道如何锁定同一个对象并导致死锁)

大多数情况下,您看到专用锁定对象正是因为这样:如果要修改已公开的集合(例如,通过属性),良好的实践表明,您不能锁定集合本身


在这种情况下,锁目标是私有的,因此如果您没有明确地将其暴露给外部世界,那么就可以了。

很好,任何对象都可以充当存储锁状态的位置

然而,在任何代码审查中,这都是一个强烈的危险信号,暗示程序员考虑锁的方式是错误的。没有“锁定对象以使其线程安全”这样的事情在.NET中确实存在这种概念,这是许多学术研究的主题,称为STM或软件事务性内存。但在.NET框架中没有一点支持这种概念


使用锁来阻止代码。可由多个线程执行并读取或写入变量的危险代码。通常在多个位置,存在于源代码文件中特定位置的代码。使用锁可确保只有一个线程可以同时在这些特定位置执行代码。lock stat因此,e与代码段相关联,而不是对象。因此,应该需要一个专用对象来存储这些特定段的锁定状态。通过拥有这样一个专用对象,而不仅仅是挑选一个放在周围的对象,您可以表明您知道自己在做什么。此外,它还具有很强的自文档功能,使其更易于实现h由于只需搜索锁定变量的名称,因此更容易查看锁定发生的位置。

这没有多大意义。通常,当您需要锁定时,并不是因为您只希望一个线程运行该代码块,而是您不希望多个线程从任意代码访问某个对象。另一个“我可以锁定一个对象,没有人可以访问它”的受害者。这有点像说,将变量标记为私有是无用的,因为它们仍然可以访问。
private class MyClass
{
    private static MyObject myObject = new MyObject();

    private void ModifyObject()
    {
        lock(myObject)
        {
            myObject.UnsafeMethod();
        }
    }
}