Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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# 锁(objlocker)是否使该对象在应用程序范围内具有线程安全性?静态成员是否自动线程安全?_C#_Multithreading_Thread Safety_Static Members - Fatal编程技术网

C# 锁(objlocker)是否使该对象在应用程序范围内具有线程安全性?静态成员是否自动线程安全?

C# 锁(objlocker)是否使该对象在应用程序范围内具有线程安全性?静态成员是否自动线程安全?,c#,multithreading,thread-safety,static-members,C#,Multithreading,Thread Safety,Static Members,锁定对象时,该对象是否在整个应用程序中都被锁定 例如,C#3.0中的这段代码概括在第19.6.1节“线程安全和.NET Framework类型”中: 阻止另一个线程访问: lock (list) items = list.ToArray( ); 或者两者可以同时执行 CLR会自动使静态方法线程安全吗?还是由开发商决定 谢谢, JohnCLR不会自动使静态方法线程安全;你必须自己做 lock(list)将该对象用作锁,因此如果不同线程使用lock(list)(使用相同的“list”对象)到达另

锁定对象时,该对象是否在整个应用程序中都被锁定

例如,C#3.0中的这段代码概括在第19.6.1节“线程安全和.NET Framework类型”中:

阻止另一个线程访问:

lock (list) items = list.ToArray(  );
或者两者可以同时执行

CLR会自动使静态方法线程安全吗?还是由开发商决定

谢谢,
John

CLR不会自动使静态方法线程安全;你必须自己做

lock(list)将该对象用作锁,因此如果不同线程使用lock(list)(使用相同的“list”对象)到达另一个点,则另一个线程将阻塞,直到第一个线程释放锁为止


需要明确的是,lock(foo)并不是“锁定foo对象”,而是获取与foo对象相关联的锁,这样关键部分(构造“lock(o)stmt”中的语句)仅在当前线程获取锁时运行。

CLR不会自动使静态方法线程安全;你必须自己做

class UsefulStuff {
    object _TheLock = new object { };
    public void UsefulThingNumberOne() {
        lock(_TheLock) {
            //CodeBlockA
        }
    }
    public void UsefulThingNumberTwo() {
        lock(_TheLock) {
            //CodeBlockB
        }
    }
}
lock(list)将该对象用作锁,因此如果不同线程使用lock(list)(使用相同的“list”对象)到达另一个点,则另一个线程将阻塞,直到第一个线程释放锁为止

需要明确的是,lock(foo)并不是“锁定foo对象”,而是获取与foo对象关联的锁,这样关键部分(构造“lock(o)stmt”中的语句)仅在当前线程获取锁时运行

class UsefulStuff {
    object _TheLock = new object { };
    public void UsefulThingNumberOne() {
        lock(_TheLock) {
            //CodeBlockA
        }
    }
    public void UsefulThingNumberTwo() {
        lock(_TheLock) {
            //CodeBlockB
        }
    }
}
CodeBlockA
CodeBlockB
不能在不同的线程中同时执行,因为它们都锁定在同一个对象实例上

锁本身上的方法完全不受影响

CodeBlockA
CodeBlockB
不能在不同的线程中同时执行,因为它们都锁定在同一个对象实例上


锁本身上的方法完全不受影响。

需要注意的另一点是,运行时以线程安全的方式执行静态构造函数。如果要创建单例并将其声明为:

public class Foo
{
    private static Foo instance = new Foo();

    public static Foo Instance
    {
        get { return instance; }
    }
}

那么它将是线程安全的。但是,如果在实例getter中实例化一个新的Foo,则需要编写自己的线程安全性(即锁定对象)

另一件需要注意的事情是,运行时以线程安全的方式执行静态构造函数。如果要创建单例并将其声明为:

public class Foo
{
    private static Foo instance = new Foo();

    public static Foo Instance
    {
        get { return instance; }
    }
}
那么它将是线程安全的。但是,如果在实例getter中实例化一个新的Foo,那么需要编写自己的线程安全性(即锁定对象)