无锁并发更新不可变集合——基于Interlocked的CAS替换
通过Interlocked.CompareExchange对不可变集合进行原子替换,实现无锁安全并发更新,避免锁竞争。 · 难度:入门 · +10XP
无锁CAS更新不可变集合
不可变集合(如ImmutableArray)本身线程安全,但更新操作需创建新实例。在多线程场景中直接赋值存在竞态条件。本教程演示如何利用Interlocked.CompareExchange(CAS)循环,以原子方式替换引用。同时结合局部引用快照,确保更新过程中不会丢失其他线程的修改。这种方法比ReaderWriterLockSlim更轻量,适用于高频读、低频写的场景。
private static ImmutableArray<int> _data = ImmutableArray<int>.Empty;
public static void AddItem(int item)
{
ImmutableArray<int> current, newArray;
do
{
current = _data;
newArray = current.Add(item);
}
while (Interlocked.CompareExchange(ref _data, newArray, current) != current);
}
// 读取无需锁
public static void ReadAll()
{
var snapshot = _data;
foreach (var i in snapshot)
Console.WriteLine(i);
}