本文例子和概念是参考《java多线程编程核心技术》---高洪岩
以前看多线程的书籍,对死锁是早有耳闻,基本概念是知道一些,但发现用代码表达的时候,不是很彻底,所以回过头来,翻书再巩固一番,并记录在此。
一、 首先为什么会产生死锁
个人理解 如果一个线程已经获取了A锁,同时还想去获取B锁,但恰恰 另一个线程已经获取B锁,同时也要去获取A锁,这样两个线程互相等待对方释放锁,就形成了死锁。
以下是产生死锁的一个例子:
public class DeadLock implements Runnable{
public boolean flag = true;
static Object o1 = new Object();
static Object o2 = new Object();
@Override
public void run() {
if (flag){
synchronized(o1){
System.out.println(Thread.currentThread().getName()+"01开始输出,等待o2输出!");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (o2){
System.out.println(Thread.currentThread().getName()+"o2开始输出!");
}
}
}else {
synchronized(o2){
System.out.println(Thread.currentThread().getName()+"02开始输出,等待o1输出!");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (o1){
System.out.println(Thread.currentThread().getName()+"o1开始输出!");
}
}
}
}
}
测试类
public class Test {
public static void main(String[] args) throws Exception{
DeadLock deadLock = new DeadLock();
deadLock.flag = true;
Thread t1 = new Thread(deadLock);
t1.start();
Thread.sleep(100);
deadLock.flag = false;
Thread t2 = new Thread(deadLock);
t2.start();
}
}
控制台输出