为多个线程共享的变量提供原子操作。
使用 Interlocked 类,可以在不阻塞线程(lock、Monitor)的情况下,避免竞争条件。
Interlocked 类是静态类,让我们先来看看 Interlocked 的常用方法:
方法 | 作用 |
---|---|
CompareExchange() | 比较两个数是否相等,如果相等,则替换第一个值。 |
Decrement() | 以原子操作的形式递减指定变量的值并存储结果。 |
Exchange() | 以原子操作的形式,设置为指定的值并返回原始值。 |
Increment() | 以原子操作的形式递增指定变量的值并存储结果。 |
Add() | 对两个数进行求和并用和替换第一个整数,上述操作作为一个原子操作完成。 |
Read() | 返回一个以原子操作形式加载的值。 |
简单测试一下:简单的自增运算。
static void Main(string[] args)
{
sum = 0;
for (int i = 0; i < 5; i++)
{
Task.Run(AddOne);
}
Thread.Sleep(TimeSpan.FromSeconds(2));
Console.WriteLine("sum = " + sum);
sumLock = 0;
for (int i = 0; i < 5; i++)
{
Task.Run( AddOneLock);
}
Thread.Sleep(TimeSpan.FromSeconds(2));
Console.WriteLine("sumLock = " + sumLock);
}
private static int sum = 0;
private static int sumLock = 0;
public static void AddOne()
{
for (int i = 0; i < 100_0000; i++)
{
sum += 1;
}
}
public static void AddOneLock()
{
for (int i = 0; i < 100_0000; i++)
{ //sum += 1;
Interlocked.Increment(ref sumLock);//以原子操作的形式递增指定变量的值并存储结果。
}
}
Interlocked 类 (System.Threading) | Microsoft Learn