死锁问题
internal class StateObject
{
private Object _lock1 = new Object();
private Object _lock2 = new Object();
private int state1 = 5;
private int state2 = 5;
public void ChangeState()
{
Console.WriteLine(Thread.CurrentThread.ManageThreadId + "拿到了第1把锁");
lock (_lock1)
{
lock (_lock2)
{
Console.WriteLine(Thread.CurrentThread.ManageThreadId + "拿到了第2把锁");
if (state1 == 5)
{
state1++;
Console.WriteLine("state: " + state1 + " 线程ID:" + Thread.CurrentThread.ManageThreadId);
}
state1 = 5;
if (state2 == 5)
{
state2++;
Console.WriteLine("state: " + state2 + " 线程ID:" + Thread.CurrentThread.ManageThreadId);
}
state2 = 5;
}
}
}
public void ChangeState()
{
lock (_lock2)
{
Console.WriteLine(Thread.CurrentThread.ManageThreadId + "拿到了第2把锁");
lock (_lock1)
{
Console.WriteLine(Thread.CurrentThread.ManageThreadId + "拿到了第1把锁");
if (state1 == 5)
{
state1++;
Console.WriteLine("state: " + state1 + " 线程ID:" + Thread.CurrentThread.ManageThreadId);
}
state1 = 5;
if (state2 == 5)
{
state2++;
Console.WriteLine("state: " + state2 + " 线程ID:" + Thread.CurrentThread.ManageThreadId);
}
state2 = 5;
}
}
}
}
解决方法——规定相同的拿锁顺序
internal class StateObject
{
private Object _lock1 = new Object();
private Object _lock2 = new Object();
private int state1 = 5;
private int state2 = 5;
public void ChangeState()
{
Console.WriteLine(Thread.CurrentThread.ManageThreadId + "拿到了第1把锁");
lock (_lock1)
{
lock (_lock2)
{
Console.WriteLine(Thread.CurrentThread.ManageThreadId + "拿到了第2把锁");
if (state1 == 5)
{
state1++;
Console.WriteLine("state: " + state1 + " 线程ID:" + Thread.CurrentThread.ManageThreadId);
}
state1 = 5;
if (state2 == 5)
{
state2++;
Console.WriteLine("state: " + state2 + " 线程ID:" + Thread.CurrentThread.ManageThreadId);
}
state2 = 5;
}
}
}
public void ChangeState()
{
lock (_lock1)
{
Console.WriteLine(Thread.CurrentThread.ManageThreadId + "拿到了第1把锁");
lock (_lock2)
{
Console.WriteLine(Thread.CurrentThread.ManageThreadId + "拿到了第2把锁");
if (state1 == 5)
{
state1++;
Console.WriteLine("state: " + state1 + " 线程ID:" + Thread.CurrentThread.ManageThreadId);
}
state1 = 5;
if (state2 == 5)
{
state2++;
Console.WriteLine("state: " + state2 + " 线程ID:" + Thread.CurrentThread.ManageThreadId);
}
state2 = 5;
}
}
}
}