1.编译环境
IDEA 2020 ,windows10, jdk8及以上版本
一、死锁是什么?
死锁指A线程想使用资源但是被B线程占用了,B线程线程想使用资源被A线程占用了,导致程序无法继续下去了。
1.1 死锁的例子;
public class Deadlock {
public static void main(String[] args) {
Object lock1 = new Object();
Object lock2 = new Object();
Thread thread1 = new Thread(new Runnable() {
@Override
public void run() {
synchronized (lock1){
System.out.println("线程一得到了lock1");
try{
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("线程一获取lock2");
synchronized (lock2){
System.out.println("线程一得到了lock2");
}
}
}
});
thread1.start();
Thread thread2 = new Thread(new Runnable() {
@Override
public void run() {
synchronized (lock2){
System.out.println("线程二得到了lock2");
try{
//让线程2,获取锁1
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("线程二获取lock1");
//尝试获取lock1
synchronized (lock1){
System.out.println("线程二得到了lock1");
}
}
}
});
thread2.start();
}
}
1.2 死锁的产生条件;
形成死锁的条件:
1.互斥条件:(当一个资源被一个线程拥有,当被一个线程拥有后就不能被其他线程所持有)
2.请求拥有条件(一个线程所持有一个资源后又试图请求另一个资源)可修改
3.不可剥夺性:(一个资源被一个线程拥有之后,如果这个线程不释放此资源,那么其他线程不能强制获得此资源)
4.环路等待条件(多个线程在获取资源时形成一个环形链)可修改
二、使用jdk内置工具检测死锁
方法一. jconsole.exe
进入你的jdk安装路径中,打开jdk/bin/jconsole.exe
使用步骤如下:
检测结果:
方法二. jvisualvm.exe
进入你的jdk安装路径中,打开jdk/bin/jvisualvm.exe
优点:比较细,比较全面
缺点:加载有点慢!
使用步骤如下:
可以在里面看到是该项目代码的第39行出现了死锁。
:
方法三. jmc.exe
进入你的jdk安装路径中,打开jdk/bin/jmc.exe
优点:可以对所以死锁进行判断
缺点:没有给出解决方法
使用步骤如下:
三、死锁解决方法
最后希望可以帮助到大家!
千千万万要记得:多刷题!!多刷题!!
之前算法是我的硬伤,后面硬啃了好长一段时间才补回来,算法才是程序员的灵魂!!!!
篇幅有限,以下只能截图分享部分的资源!!
(1)多线程(这里以多线程为代表,其实整理了一本JAVA核心架构笔记集)
(2)刷的算法题(还有左神的算法笔记)
(3)面经+真题解析+对应的相关笔记(很全面)
(4)视频学习(部分)
ps:当你觉得学不进或者累了的时候,视频是个不错的选择
在这里,最后只一句话:祝大家offer拿到手软!!
76ve7-1714573315570)]
(3)面经+真题解析+对应的相关笔记(很全面)
[外链图片转存中…(img-zlWyybTG-1714573315570)]
(4)视频学习(部分)
ps:当你觉得学不进或者累了的时候,视频是个不错的选择
在这里,最后只一句话:祝大家offer拿到手软!!