无锁代码下,在读写字段时使用内存屏障往往是不够的。在 64 位字段上进行加、减操作需要使用Interlocked工具类这样更加重型的方式。Interlocked也提供了Exchange和CompareExchange方法,后者能够进行无锁的读-改-写(read-modify-write)操作,只需要额外增加一点代码。

  Interlocked类通过将原子性的需求传达给操作系统和虚拟机来进行实现其功能。

  Interlocked类的方法通常产生 10ns 的开销,是无竞争锁的一半。此外,因为它们不会导致阻塞,所以不会带来上下文切换的开销。然而,如果在循环中多次迭代使用Interlocked,就可能比在循环外使用一个锁的效率低(不过Interlocked可以实现更高的并发度)。

// 自增
Interlocked.Increment(ref number);

// 自减
Interlocked.Decrement(ref number);

// 加/减一个值:
Interlocked.Add(ref number, 3);

// 读取64位字段:
Console.WriteLine(Interlocked.Read(ref number));

// 读取当前值并且写64位字段
Console.WriteLine(Interlocked.Exchange(ref number, 10));

// 仅当字段的当前值匹配特定的值(10)时才更新它:
Console.WriteLine(Interlocked.CompareExchange(ref number, 123, 10));