我需要在C#.Net中创建一个Thread安全的静态变量

好吧,它比问题复杂一点。

class A { static int needsToBeThreadSafe = 0; public static void M1() { needsToBeThreadSafe = RandomNumber(); } public static void M2() { print(needsToBeThreadSafe); } } 

现在我要求在M1()和M2()之间调用’needsToBeThreadSafe’保持线程安全。

您可能要问的是[ ThreadStatic ]属性。 如果您希望每个使用A类的线程都有自己独立的needsToBeThreadSafe值,那么您只需要使用[ ThreadStatic ]属性来装饰该字段。

有关更多信息,请参阅ThreadStaticAttribute的MSDN文档 。

怎么样:

 public static void M1() { Interlocked.Exchange( ref needsToBeThreadSafe, RandomNumber() ); } public static void M2() { print( Interlocked.Read( ref needsToBeThreadSafe ) ); } 

您有两种选择:给出您提供的代码最简单的是volatile关键字。 将needsToBeThreadSafe声明为static volatile int ,这将保证引用该变量的任何线程都将获得“最新”副本,并且该变量不会缓存在您的代码中。

话虽如此,如果你想更一般地确保M1()M2()执行“primefaces”(或至少互相排斥),那么你想要使用lock 。 最干净的语法是使用“锁定块”,如下所示:

 private static object locker = new Object(); //.. public static void M1() { lock(locker) { //..method body here } } public static void M2() { lock(locker) { //..method body here } } 

至于采取哪种方法,这取决于你,应该由代码决定。 如果你需要的只是确保成员赋值传播到所有线程而不是缓存,那么volatile关键字更简单,并且可以很好地完成工作。 如果它超出了这个范围,你可能想要lock

 class A { static int needsToBeThreadSafe = 0; static object statObjLocker = new object(); public static void M1() { lock(statObjLocker) { needsToBeThreadSafe = RandomNumber(); } } public static void M2() { lock(statObjLocker) { print(needsToBeThreadSafe); } } } 

听起来像你需要一个易变的成员。

 static volatile int needsToBeThreadSafe = 0; 

您还可以使用ReaderWriterLockSlim,它对多次读取和更少写入更有效:

 static int needsToBeThreadSafe = 0; static System.Threading.ReaderWriterLockSlim rwl = new System.Threading.ReaderWriterLockSlim(); public static void M1() { try { rwl.EnterWriteLock(); needsToBeThreadSafe = RandomNumber(); } finally { rwl.ExitWriteLock(); } } public static void M2() { try { rwl.EnterReadLock(); print(needsToBeThreadSafe); } finally { rwl.ExitReadLock(); } } 

首先,我同意使用lock()的答案,这是最安全的方法。

但是存在一种更简约的方法,你的示例代码只显示使用needsToBeThreadSafe单个语句,因为int是primefaces的,你只需要防止编译器使用volatile进行缓存:

 class A { static volatile int needsToBeThreadSafe = 0; } 

但是如果你需要toToBeThreadSafe作为多个语句的’ThreadSafe’,请使用锁。