【 java 多线程】死锁的问题
📋 个人简介
- 💖 作者简介:大家好,我是阿牛,全栈领域优质创作者。😜
- 📝 个人主页:馆主阿牛🔥
- 🎉 支持我:点赞👍+收藏⭐️+留言📝
- 📣 系列专栏:java 小白到高手的蜕变🍁
- 💬格言:要成为光,因为有怕黑的人!🔥
目录
- 📋 个人简介
- 前言
- 什么是线程的死锁
- 案例
- 怎么避免死锁问题
- 结语
前言
死锁的问题·相信大家看的博文多了也很熟悉,本文将从案例入手,介绍一下死锁。
什么是线程的死锁
- 不同的线程分别占用对方需要的同步资源不放弃,都在等待对方放自己需要的同步资源,就形成了线程的死锁。
- 出现死锁后,不会出现异常,不会出现提示,只是所有的线程都处阻塞状态。
案例
package 死锁;
public class Deadlock {
public static void main(String[] args) {
String s1 = new String("我是s1");
String s2 = new String("我是s2");
// 线程一
new Thread(){
@Override
public void run() {
synchronized (s1){ // 锁s1
try {
sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(s1.toString());
synchronized (s2){ // 锁s2
System.out.println(s2.toString());
}
}
}
}.start();
// 线程二
new Thread(){
@Override
public void run() {
synchronized (s2){ // 锁s2
try {
sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(s2);
synchronized (s1){ // 锁s1
System.out.println(s1);
}
}
}
}.start();
}
}
这个案例就是一个典型的死锁问题,当线程一占用锁s1和线程二占用锁s2后,他们都需要往下执行,但线程一向下执行需要锁s2,而s2被线程二占用;同理,线程二向下执行需要锁s1,而s1被线程一占用。这就形成了死锁。
可以看运行结果图,不会出现异常,不会出现提示,只是所有的线程都处阻塞状态。
怎么避免死锁问题
- 专门的算法、原则。
- 尽量减少同步资源的定义。
- 尽量避免嵌套同步。
结语
如果你觉得博主写的还不错的话,可以关注一下当前专栏,博主会更完这个系列的哦!也欢迎订阅博主的其他好的专栏。
🏰系列专栏
👉软磨 css
👉硬泡 javascript
👉flask框架快速入门