在java 多线程中 过多的同步造成相互不释放资源 从而相互等待,造成死锁线现象,一般发生于同步中持有多个对象锁

如以下代码:

public class DeadLock {
public static void main(String[] args) {
WuDao wd1 = new WuDao(0, "金毛狮王");
WuDao wd2 = new WuDao(1, "灭绝师太");
wd1.start();
wd2.start();
}
} // 屠龙刀
class TuLongDao { } // 倚天剑
class YiTianJian { } class WuDao extends Thread {
static TuLongDao tld = new TuLongDao();
static YiTianJian ytj = new YiTianJian();
// 选择
int choice;
// 名字
String name; @Override
public void run() {
// 悟道
wudao();
} public WuDao(int choice, String name) {
super();
this.choice = choice;
this.name = name;
} private void wudao() {
if (choice == 0) {
synchronized (tld) { // 获得屠龙刀锁
System.out.println(this.name + "领悟屠龙刀法");
// 1秒后想拥有倚天剑锁
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (ytj) {
System.out.println(this.name + "领悟武穆遗书");
}
}
} else {
synchronized (ytj) { // 获得倚天锁
System.out.println(this.name + "领悟倚天剑法");
// 2秒后想拥有屠龙刀锁
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (tld) {
System.out.println(this.name + "领悟九阴真经");
}
}
}
}
}

运行以上代码:

可以看到:由于发生死锁,程序不能继续运行

解决方案:

不要在同一代码块中,同时持有多个对象锁。

我们只要把synchronized 代码块中的第二个锁往外移一下就可以了,修改后代码如下:

private void wudao() {
if (choice == 0) {
synchronized (tld) { // 获得屠龙刀锁
System.out.println(this.name + "领悟屠龙刀法");
// 1秒后想拥有倚天剑锁
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
/*synchronized (ytj) {
System.out.println(this.name + "领悟武穆遗书");
}*/
}
synchronized (ytj) {
System.out.println(this.name + "领悟武穆遗书");
}
} else {
synchronized (ytj) { // 获得倚天锁
System.out.println(this.name + "领悟倚天剑法");
// 2秒后想拥有屠龙刀锁
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
/*synchronized (tld) {
System.out.println(this.name + "领悟九阴真经");
}*/
}
synchronized (tld) {
System.out.println(this.name + "领悟九阴真经");
}
}
}

再次运行修改后代码:



代码可以正常运行了。

最新文章

  1. 【BZOJ-3627】路径规划 分层图 + Dijkstra + spfa
  2. Range Sum Query 2D - Mutable & Immutable
  3. Trapping Rain Water
  4. 自定义input[type="radio"]的样式
  5. Mybatis动态SQL
  6. OA学习笔记-003-Hibernate3.6配置
  7. Eclipse 每行 80 字符限制的提示线
  8. Scrapy:python3下的第一次运行测试
  9. redis的内部实现机制
  10. Java数据结构和算法
  11. C#抓取和分析网页的类
  12. C# 13行代码带你模拟登录QQ空间
  13. centos7的Kubernetes部署记录
  14. MQ4入门篇(一)
  15. STM32(HY-SRF05)超声波测距项目
  16. hdoj:2056
  17. rtsp简介
  18. python基础 ---- 使用pyCharm 调试
  19. iOS-iOS9系统SEGV_ACCERR问题处理【v3.6.3的一些bug修复】
  20. web.xml之context-param,listener,filter,servlet加载顺序及其周边

热门文章

  1. Python turtle库的应用——蛇
  2. PTA数据结构与算法题目集(中文) 7-42整型关键字的散列映射 (25 分)
  3. Java HashMap源码详解
  4. MyBatis(六):SqlSession执行源码分析
  5. Flask 入门(八)
  6. TensorFlow保存、加载模型参数 | 原理描述及踩坑经验总结
  7. Weblogic-SSRF 漏洞复现
  8. 【python实现卷积神经网络】池化层实现
  9. 【转】Centos7启动网卡(获取ip地址)
  10. 初识指令重排序,Java 中的锁