Java中多线程死锁问题及注意事项

出现死锁的前提:

    1.必须是多线程

    2.出现了同步嵌套

先定义两个锁类:

/*
 * 定义A对象锁
 * 将构造器私有化,使得外类中不能创建A锁对象
 * 创建静态A锁对象,让外类直接  类名.成员变量名  调用这个锁
 * 这种方式保证了死锁的另一前提—锁的唯一性,否则两个同步嵌套各有各的锁,就形不成死锁 
 */
public class LockA {
	private LockA() {
		super();
	}
	
	public final static LockA locka = new LockA();
}
/*
 * 定义B对象锁
 * 将构造器私有化,使得外类中不能创建B锁对象
 * 创建静态B锁对象,让外类直接  类名.成员变量名  调用这个锁
 * 这种方式保证了死锁的另一前提—锁的唯一性,否则两个同步嵌套各有各的锁,就形不成死锁 
 */
public class LockB {
	private LockB() {
		super();
	}
	public static final LockB lockb = new LockB();
}

定义死锁类:

/*
 * 死锁案例,由于存在两种状态:1.先获取A锁再获取B锁	2.先获取B锁再获取A锁
 * 所以使用奇偶数来定义两种状态(boolean也可以)
 * 在同步代码块中使用静态调用方式,可以保证获取到的是唯一锁
 */
public class DeadLock implements Runnable{
	private int i = 0;
	public void run() {
		while(true) {
			if(i % 2 == 0) {
				//先进A同步,再进入B同步
				synchronized(LockA.locka) {
					System.out.println("if...locka");
					synchronized(LockB.lockb) {
						System.out.println("if...lockb");
					}
				}
			}else {
				//先进B同步,再进A同步
				synchronized (LockB.lockb) {
					System.out.println("else...lockb");
					synchronized (LockA.locka) {
						System.out.println("else...locka");
					}
				}
			}
			i++;
		}
	}
}

猜你喜欢

转载自blog.csdn.net/sinat_37320521/article/details/80051003