using System;
using System.Threading;
namespace ConsoleHelper
{
public class Program
{
public static void Main(string[] args)
{
var c = new CounterNoLock(); // 线程不安全
var t1 = new Thread(() => TestCounter(c));
var t2 = new Thread(() => TestCounter(c));
var t3 = new Thread(() => TestCounter(c));
t1.Start();
t2.Start();
t3.Start();
t1.Join();
t2.Join();
t3.Join();
Console.WriteLine("CounterNoLock count:{0}", c.Count);
Console.WriteLine("------------------------------------");
var c1 = new CounterWithLock(); // 线程安全
t1 = new Thread(() => TestCounter(c1));
t2 = new Thread(() => TestCounter(c1));
t3 = new Thread(() => TestCounter(c1));
t1.Start();
t2.Start();
t3.Start();
t1.Join();
t2.Join();
t3.Join();
Console.WriteLine("CounterWithLock count:{0}", c1.Count);
Console.WriteLine();
}
// lock 同步代码块
public static void TestCounter(CounterBase c)
{
for (int i = 0; i < 100000; i++)
{
c.Increment();
c.Decrement();
}
}
}
public abstract class CounterBase
{
public abstract void Increment();
public abstract void Decrement();
}
public class CounterNoLock : CounterBase
{
public int Count { get; private set; }
public override void Decrement()
{
Count++;
}
public override void Increment()
{
Count--;
}
}
public class CounterWithLock : CounterBase
{
private readonly object _syncRoot = new object();
public int Count { get; private set; }
public override void Decrement()
{
lock (_syncRoot)
{
Count++;
}
}
public override void Increment()
{
lock (_syncRoot)
{
Count--;
}
}
}
}
(不)使用lock关键字对Count进行计数步骤
1. 启动t1,t2,t3三个线程;
2. 分别等待所有线程运行完成;
3. 打印最终结果