C# 锁(objlocker)是否使该对象在应用程序范围内具有线程安全性?静态成员是否自动线程安全?
锁定对象时,该对象是否在整个应用程序中都被锁定 例如,C#3.0中的这段代码概括在第19.6.1节“线程安全和.NET Framework类型”中: 阻止另一个线程访问: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”对象)到达另
lock (list) items = list.ToArray( );
或者两者可以同时执行
CLR会自动使静态方法线程安全吗?还是由开发商决定
谢谢,
JohnCLR不会自动使静态方法线程安全;你必须自己做 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,那么需要编写自己的线程安全性(即锁定对象)