C# 线程安全
一、介绍(四种方法)
1、锁
2、使用安全线程对象
3、直接使用单线程
4、通过算法+拆分做到---划块操作数据;原理:还是单线程去操作一块数据
二、锁
1、标准锁
// 定义 private static readonly object objLock = new object(); // 使用 lock (objLock) { // 代码 }
2、案例
private static readonly object objLock = new object(); private void btnInvoke_Click(object sender, EventArgs e) { List<Task> list = new List<Task>(); List<int> ints = new List<int>(); for (int i = 0; i < 1000; i++) { int k = i; Task task = Task.Run(() => { lock (objLock) { ints.Add(k); } }); list.Add(task); } Task.WaitAll(list.ToArray()); Console.WriteLine(ints.Count); }
三、线程安全对象
1、分类
a、安全无须集合
ConcurrentBag<int> ints = new ConcurrentBag<int>();
b、安全队列集合
// 定义 ConcurrentQueue<int> queue = new ConcurrentQueue<int>(); // 进队列 queue.Enqueue(value); // 出队列 result 为结果 queue.TryDequeue(out int result); // 数量 queue.Count
c、安全 栈 集合
// 定义 ConcurrentStack<int> stack = new ConcurrentStack<int>(); // 压栈 stack.Push(k); // 出栈 stack.TryPop(out int result); // 数量 stcak.Count
d、安全字典集合
// 定义 ConcurrentDictionary<string, int> dict = new ConcurrentDictionary<string, int>(); // 新增or更新 dict[k] = v
e、阻塞安全集合
// 定义 BlockingCollection<int> blocks = new BlockingCollection<int>(); // 新增 blocks.Add(v);
2、案例
a、安全无须集合
List<Task> list = new List<Task>(); ConcurrentBag<int> ints = new ConcurrentBag<int>(); for (int i = 0; i < 1000; i++) { int k = i; Task task = Task.Run(() => { ints.Add(k); }); list.Add(task); } Task.WaitAll(list.ToArray()); Console.WriteLine(ints.Count);
b、安全队列集合
List<Task> list = new List<Task>(); ConcurrentQueue<int> queue = new ConcurrentQueue<int>(); for (int i = 0; i < 1000; i++) { int k = i; Task task = Task.Run(() => { queue.Enqueue(k); }); list.Add(task); } Task.WaitAll(list.ToArray()); Console.WriteLine(queue.Count);
c、安全 栈 集合
List<Task> list = new List<Task>(); ConcurrentStack<int> stack = new ConcurrentStack<int>(); for (int i = 0; i < 1000; i++) { int k = i; Task task = Task.Run(() => { stack.Push(k); }); list.Add(task); } Task.WaitAll(list.ToArray()); Console.WriteLine(stack.Count);
d、安全字典集合
List<Task> list = new List<Task>(); ConcurrentDictionary<string, int> dict = new ConcurrentDictionary<string, int>(); for (int i = 0; i < 1000; i++) { int v = i; string k = $"k{v}"; Task task = Task.Run(() => { dict[k] = v; }); list.Add(task); } Task.WaitAll(list.ToArray()); Console.WriteLine(dict.Count);
e、阻塞安全集合
List<Task> list = new List<Task>(); BlockingCollection<int> blocks = new BlockingCollection<int>(); for (int i = 0; i < 1000; i++) { int v = i; Task task = Task.Run(() => { blocks.Add(v); }); list.Add(task); } Task.WaitAll(list.ToArray()); Console.WriteLine(blocks.Count);

浙公网安备 33010602011771号