【C# 线程】interLocked锁

overview

同步基元分为用户模式和内核模式

用户模式:Iterlocked.Exchange(互锁)、SpinLocked(自旋锁)、易变构造(volatile关键字、volatile类、Thread.VolatitleRead|Thread.VolatitleWrite)、MemoryBarrier。

.net中的System.Threading命名空间的Interlocked类可以为多个线程共享的变量提供原子操作。

经验显示,那些需要在多线程下被保护的资源通常是整型的,而这些被共享的整型值最常见的操作就是增加、减少。Interlocked类提供了一个专门的机制用于完成这些特定的操作。

 

Iterlocked.Exchange() 不只是原子的,它还照顾了内存可见性。

Interlocked 轻量级锁

Interlocked.Increment(ref value)     数值加一(原子性操作)
Interlocked.Decrement(ref value)     数值减一(原子性操作)
Interlocked.Exchange(ref value1, value2)     交换:把值2赋给值1;返回新值
Interlocked.CompareExchange(ref value1, value2, value3)     实现比较和交换两种功能:值1和值3比较,如果相同,把值2给值1,不相同则不作任何操作;返回原值(多用于判断条件)(示例3中会用到)

Interlocked.MemoryBarrier :按如下方式同步内存存取:执行当前线程的处理器在对指令重新排序时,不能采用先执行 MemoryBarrier() 调用之后的内存存取,再执行 MemoryBarrier() 调用之前的内存存取的方式。Thread.MemoryBarrier 就是包装了它。

Interlocked.MemoryBarrierProcessWide:用于进程 的内存屏障。整个进程范围的内存屏障非常昂贵。 它必须强制执行进程中的每个 CPU,以可能产生成千上万个循环。

注意不要传入 volatile类型。

上一篇:在 Exchange 中的模拟和 EWS(转)


下一篇:小微企业阿里云最佳实践系列(一):ECS 服务器与 RDS 数据库