C#多线程加锁实例

首次发布:2018-05-13

多线程同时计算同一个项目时,不会累计


如 int i=0,

 2个线程同时计算加1    则i=1,

 如果不是同时计算加1  则i=2

线程加锁--可以解决累计不对

以下是核心代码


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
private void button1_Click(object sender, EventArgs e)
{
    List<IAsyncResult> listAction = new List<IAsyncResult>();
    for (int i = 0; i < 20; i++)
    {
        //创建线程 总共20个线程
        listAction.Add(new Action(() =>
        {
            Calculation();
        }).BeginInvoke(null, null));
    }
    //等所有线程都结束
    while (listAction.Count(r => !r.IsCompleted) > 0)
    {
        Thread.Sleep(100);
    }
    Console.WriteLine("加锁---计算结果为:{0}", count);
}
public static int count1 = 0;
public static int count = 0;
public static object o = new object();
private static void Calculation()
{
    lock (o)//加锁
    {
        for (int j = 0; j < 10000000; j++)
        {
            count = count + 1;
        }
    }
}
计算结果如下 没有锁的要比实际累计要少,因为没加锁时可能会有两个线程同时计算