Lock死锁的案例

  • Post author:
  • Post category:其他




Lock死锁的案例

死锁:线程A和线程B相互等待对方持有的锁导致程序无限死循环下去

(1)两个线程里面分别持有两个Object对象:lock1和lock2。这两个lock作为同步代码块的锁;

(2)线程1的run()方法中同步代码块先获取lock1的对象锁,Thread.sleep(xxx),然后接着获取lock2的对象锁。这么做主要是为了防止线程1启动一下子就连续获得了lock1和lock2两个对象的对象锁

(3)线程2的run()方法中同步代码块先获取lock2的对象锁,接着获取lock1的对象锁,当然这时lock1的对象锁已经被线程1锁持有,线程2肯定是要等待线程1释放lock1的对象锁的

public class DeadLock
{
    private final Object lock1 = new Object();
    private final Object lock2 = new Object();
    
    public void Lock1() throws Exception
    {
        synchronized (lock1)
        {
            Thread.sleep(100);
            synchronized (lock2)
            {
	                System.out.println("111 end!");
            }
        }
    }
    
		    public void Lock2() throws Exception
    {
        synchronized (lock2)
        {
            Thread.sleep(100);
            synchronized (lock1)
            {
                System.out.println("222 end!");
            }
        }
    }
}
public class Thread0 extends Thread
{
    private DeadLock dl;
    
    public Thread0(DeadLock dl)
    {
        this.dl = dl;
    }
    
    public void run()
    {
        try
        {
            dl.Lock1();
        } 
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
}
public class Thread1 extends Thread
{
    private DeadLock dl;
    
    public Thread1(DeadLock dl)
    {
        this.dl = dl;
    }
    
    public void run()
    {
        try
        {
            dl.Lock2();
        } 
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
}
public static void main(String[] args)
{
    DeadLock dl = new DeadLock();
    Thread0 t0 = new Thread0(dl);
    Thread1 t1 = new Thread1(dl);
    t0.start();
    t1.start();

    while(true);   
}



版权声明:本文为qq_28355331原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。