关于静态类中的静态变量的问题。
如果我有一个静态类并在其中设置了一个公开暴露的属性的值,那么这个变量的值是否对该类的所有实例都设置了?因此,如果线程1将属性的值设置为999,那么线程2的值也会被设置为999吗?
是的,这是正确的。静态类的字段在一个应用程序域(AppDomain)中只有一份拷贝。
但是您需要考虑同步问题。如果线程1设置(写入)变量,而线程2同时读取它,可能会得到意外的结果,因为一个写操作可能实际上被分成多个处理器指令。
假设您设置了一个long
的值。这是一个64位的值,写入它至少涉及两个处理器指令(在32位机器上)。理论上可能读取同一long
变量的操作被安排在这两个写操作指令之间,从而导致意外行为。
ThreadStatic
),static
属性都在类的所有实例之间共享。但是,是的,当处理这些属性时,可能存在潜在的多线程问题。以下是我认为其他人所指的情况。int x = MyClass.StaticProperty;
MyClass.StaticProperty = x + 1;
线程1 线程2 int x = MyClass.StaticProperty; // 假设x是1 int x = MyClass.StaticProperty; // 假设x也是1 MyClass.StaticProperty = x + 1; // 那么现在x变成了2 MyClass.StaticProperty = x + 1; // 同样写入2你看出问题了吗?两个线程都可能在任何一个线程写入该属性值之前读取它的值;而被写入的值取决于读取的值,而这两个线程读取到的值是相同的!
System.Threading
命名空间中提供了一个方便的类,可以使多线程读写相对轻松地实现: Interlocked
。例如,在线程安全的情况下递增上面的StaticProperty
,您可以按照以下方式更新MyClass
:class MyClass
static int _staticProperty;
public static int StaticProperty
{
get { return _staticProperty; }
}
public static int IncrementProperty()
{
// increments _staticProperty ATOMICALLY
// and returns its previous value
return Interlocked.Increment(_staticProperty);
}
}