线程死锁
一.概念原理
要点:
1.多线程竞争资源
2.占有一个同步资源去请求另外一个同步资源
3.线程争抢资源的顺序不同
二.死锁代码
public class TestDeadLock implements Runnable{
public static void main(String[] args) {
TestDeadLock dead = new TestDeadLock(true);
TestDeadLock dead2 = new TestDeadLock(false);
new Thread(dead).start();
new Thread(dead2).start();
}
//定义一个分支控制条件
public boolean flag = true;
public TestDeadLock(boolean f) {
this.flag = f;
}
//加锁对象
public static Object o1 = new Object();
public static Object o2 = new Object();
@Override
public void run() {
if(flag) {
System.out.println(Thread.currentThread().getName()+":请求o1资源");
synchronized (o1) { //拿到o1对象的锁
System.out.println(Thread.currentThread().getName()+":拿到o1资源");
System.out.println(Thread.currentThread().getName()+":请求o2资源");
synchronized (o2) {//请求o2对象的锁
System.out.println(Thread.currentThread().getName()+":拿到o2资源");
}
}
}else {
System.out.println(Thread.currentThread().getName()+":请求o2资源");
synchronized (o2) {//拿到o2对象的锁
System.out.println(Thread.currentThread().getName()+":拿到o2资源");
System.out.println(Thread.currentThread().getName()+":请求o1资源");
synchronized (o1) {//请求o1对象的额锁
System.out.println(Thread.currentThread().getName()+":拿到o1资源");
}
}
}
}
}
三.检测死锁
方法1:jconsole
第一步:命令行jconsole
第二步:选择进程
第三步:进入jconsole控制台,选择线程,检测死锁
第四步:分析死锁代码
还可用jps查看:
省略
解决线程死锁:
1.代码排他,占用锁的情况下不再申请另外的锁.
2.加锁顺序保证一致性,即所有的线程加锁的顺序都是一致的.
3.锁粗化,即一把大锁,控制所有的锁,不在细分一个个的小资源锁.