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++;
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值