我需要在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’,请使用锁。