线程同步:多个线程同时运行时,可能会同时对同一个内存地址进行写入。同步就是协同步调,按预定的先后次序进行运行。如:你说完,我再说。
实现同步的三种方法
1.使用lock锁
class ThredTest
{
static int money = 10000;
static object suo = new object();
static void getMoney(string name)
{
lock (suo)
{
Console.WriteLine($"线程{name},余额为{money}");
money--;
Console.WriteLine($"取完了,剩{money}");
}
}
static void Main(string[] args)
{
Thread t1 = new Thread(()=> {
for(int i = 0; i < 1000; i++)
{
getMoney("t1");
}
});
Thread t2 = new Thread(() => {
for (int i = 0; i < 1000; i++)
{
getMoney("t2");
}
});
t1.Start();
t2.Start();
}
}
2.[MethodImpl(MethodImplOptions.Synchronized)]
[MethodImpl(MethodImplOptions.Synchronized)]
static void getMoney(string name)
{
Console.WriteLine($"线程{name},余额为{money}");
money--;
Console.WriteLine($"取完了,剩{money}");
}
3.Monitor.Enter(locker);
使用lock 会在外面等直到占用的线程退出下一个线程才能进去,当有大批量的数据访问时容易造成阻塞,而 Monitor.TryEnter无论有没有获取对象锁都会返回结果。
static void getMoney(string name)
{
if(Monitor.TryEnter(suo))
{
try
{
Console.WriteLine($"线程{name},余额为{money}");
money--;
Console.WriteLine($"取完了,剩{money}");
}
finally
{
Monitor.Exit(suo);//释放suo对象的锁
}
}
}