001 Java线程死锁模拟

1、线程A获得lock1锁,睡一下,然后期望获得lock2锁;

static class A extends Thread{
		@Override
		public void run() {
			//先获取lock1锁
			synchronized(lock1){
				//睡一下
				try {
					Thread.sleep(100);
				} 
				catch (InterruptedException e) {
					e.printStackTrace();
				}
				//再获取lock2锁
				synchronized(lock2){
					System.out.println("A run ok.");
				}
			}
		}
	}

2、线程B获得lock2锁,睡一下,然后期望获得lock1锁;

static class B extends Thread{
		@Override
		public void run() {
			//先获取lock2锁
			synchronized(lock2){
				//睡一下
				try {
					Thread.sleep(100);
				} 
				catch (InterruptedException e) {
					e.printStackTrace();
				}
				//再获取lock1锁
				synchronized(lock1){
					System.out.println("B run ok.");
				}
			}
		}
	}

3、启动代码;

Thread a = new A();
Thread b = new B();
		
a.start();
b.start();

4、分析;

        //1、a线程把lock1持有,b线程把lock2持有;
        //2、a线程期待获得b线程持有的lock2锁;
        //3、b线程期待获得a线程持有的lock1锁;
        //4、a、b都希望获得对方的锁,才愿意释放对方需要的锁;
        //5、死锁于是产生

猜你喜欢

转载自blog.csdn.net/haishui2/article/details/82594443
001