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);

 

posted @ 2025-07-07 19:43  市丸银  阅读(110)  评论(0)    收藏  举报