java线程死锁的简单解释和解决办法


public class Test01 extends Thread {
	
	public Object o1;
	public Object o2;
	
	public Test01(Object o1,Object o2){
		this.o1 = o1;
		this.o2 = o2;
	}

	@Override
	public void run() {
		
		synchronized (o1) {
			System.out.println("线程A持有o1对象锁");
			
			synchronized (o2) {
				System.out.println("线程A持有o1和o2两个对象锁");
				o2.notify();
			}
			System.out.println("线程A释放o2锁,但是继续持有o1锁");
		}
		System.out.println("线程A释放o1锁,不再持有对象锁");
		
	}

	
}
empty
public class Test02 extends Thread {

	public Object o1;
	public Object o2;
	
	public Test02(Object o1,Object o2){
		this.o1 = o1;
		this.o2 = o2;
	}
	
	@Override
	public void run() {//死锁
		
		synchronized (o2) {
			System.out.println("线程B持有o2对象锁");
			try {
				o2.wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			synchronized (o1) {
				System.out.println("线程B持有o2和o1两把对象锁");
			}
			System.out.println("线程B释放o1锁,但是继续持有o2锁");
		}
		
		System.out.println("线程B释放o2锁,不再持有对象锁");
		
	}

	
	
}


当线程O1和O2线程都有自己的线程锁,并且O1线程锁里还有O2持有线程锁,反之并O2线程锁里还有O1持有线程锁,两个线程同是运行时就发生了死锁现象,O1和O2都

在等对方释放资源,简单的解决办法就是用用Object类中的wait()和notify(),用法是谁等待,谁打开。

你可能感兴趣的:(java线程死锁的简单解释和解决办法)