在Java的多线程中,多个线程共同争夺一个资源的时候,就会照成死锁的问题,为了保证不产生死锁的问题,可以在一个线程中使用一个锁,保证锁的唯一性,这样就可以解决死锁问题
死锁案例
在这个案例中,定义了两个锁,而且在同步代码块中两个锁相互嵌套,如果在初始化的时候,设定两个锁的启动顺序不一致,就会造成死锁
package com.yellowcong.thread.demo;
/**
* 创建日期:2017年10月5日 <br/>
* 创建用户:yellowcong <br/>
* 功能描述:
*/
public class DeadLockThread implements Runnable {
public static final Object LOCAK_A = new Object();
public static final Object LOCAK_B = new Object();
private boolean lockA;
public DeadLockThread(boolean lockA) {
super();
this.lockA = lockA;
}
public boolean isLock() {
return lockA;
}
public void setLock(boolean lockA) {
this.lockA = lockA;
}
public void run() {
// TODO Auto-generated method stub
while (true) {
if (lockA) {
// 同步代码中嵌套了 锁A 锁B
synchronized (LOCAK_A) {
System.out.println(Thread.currentThread().getName() + "\t执行锁同步代码块A");
synchronized (LOCAK_B) {
System.out.println(Thread.currentThread().getName() + "\t执行锁同步代码块B");
}
}
} else {
// 同步代码块
synchronized (LOCAK_B) {
System.out.println(Thread.currentThread().getName() + "\t执行锁同步代码块B");
synchronized (LOCAK_A) {
System.out.println(Thread.currentThread().getName() + "\t执行锁同步代码块A");
}
}
}
}
}
}
测试代码
线程A和线程B,初始化的时候,两个线程锁的启动顺序不一致,造成锁争夺,导致了死锁,代码执行一段,就会卡死
package com.yellowcong.thread.demo;
/**
* 创建日期:2017年10月5日 <br/>
* 创建用户:yellowcong <br/>
* 功能描述:
*/
public class DeadLocakTest {
public static void main(String[] args) {
//线程1
DeadLockThread th = new DeadLockThread(true);
new Thread(th,"线程 1").start();
//线程2
DeadLockThread th2 = new DeadLockThread(false);
new Thread(th2,"线程2").start();
}
}