死锁问题

死锁问题


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;
            }
        }
    }
}
posted @ 2023-10-04 15:54  天空之城00  阅读(11)  评论(0)    收藏  举报