Java 多线程 --死锁及解决方案
在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 + "领悟九阴真经");
}
}
}
再次运行修改后代码:

代码可以正常运行了。
Java 多线程 --死锁及解决方案的更多相关文章
- Java 多线程 死锁 隐性死锁 数据竞争 恶性数据竞争 错误解决深入分析 全方向举例
在几乎所有编程语言中,由于多线程引发的错误都有着难以再现的特点,程序的死锁或其它多线程错误可能只在某些特殊的情形下才出现,或在不同的VM上运行同一个程序时错误表现不同.因此,在编写多线程程序时,事先认 ...
- java多线程--死锁
1. Java中导致死锁的原因 Java中死锁最简单的情况是,一个线程T1持有锁L1并且申请获得锁L2,而另一个线程T2持有锁L2并且申请获得锁L1,因为默认的锁申请操作都是阻塞的,所以线程T1和T2 ...
- Java 多线程 - 死锁deadlock产生原因+避免方法
ref: java中产生死锁的原因及如何避免 https://blog.csdn.net/m0_38126177/article/details/78587845 java如何避免死锁 http:// ...
- Java多线程死锁的产生实例
死锁产生的四个必要条件: (1) 互斥条件:一个资源每次只能被一个进程使用.(2) 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放.(3) 不剥夺条件:进程已获得的资源,在末使用完 ...
- Java多线程——死锁
当一个线程永远地持有一个锁,并且其他线程都尝试获得这个锁时,那么他永远被阻塞,当线程A持有锁L并想获得锁M的同时,线程B持有锁M并同时尝试获得锁L时,那么两个线程将永远的等待下去,这中情况就是简单的死 ...
- java 多线程死锁
死锁案例: package com.test; public class DealThread implements Runnable { public String username; public ...
- java多线程死锁
进程(线程)同步的基本概念 进程之间的制约关系 1. 直接制约关系(进程同步) 这个关系主要源于进程合作,例如,有一个输入进程A通过单缓冲向进程B提供数据,当该缓冲空时,进程B因为不能获得所需数据而被 ...
- Java多线程编程核心技术(二)对象及变量的并发访问
本文主要介绍Java多线程中的同步,也就是如何在Java语言中写出线程安全的程序,如何在Java语言中解决非线程安全的相关问题.阅读本文应该着重掌握如下技术点: synchronized对象监视器为O ...
- java多线程:线程同步synchronized(不同步的问题、队列与锁),死锁的产生和解决
0.不同步的问题 并发的线程不安全问题: 多个线程同时操作同一个对象,如果控制不好,就会产生问题,叫做线程不安全. 我们来看三个比较经典的案例来说明线程不安全的问题. 0.1 订票问题 例如前面说过的 ...
随机推荐
- return console.log()结果为undefined现象的解答
console.log总是出现undefined--麻烦的console //本文为作者自己思考后总结出的一些理论知识,若有错误,欢迎指出 bug出现 需求如下:新建一个car对象,调用其中的de ...
- iOS提审笔记
查看苹果各大系统的服务状态:中国区服务:https://www.apple.com/cn/support/systemstatus/美国区服务:https://developer.apple.com/ ...
- Markdown语法快速学习
Markdown 简洁语法说明 0.前言 一直以来都是以word文档做笔记,存在很多问题,比如代码格式.高亮等.这次公司要求使用markdown,感觉眼前一亮,以前word的问题都得到了解决,而且可以 ...
- JAVA实现图片验证
一.什么是图片验证码? 可以参考下面这张图: 我们在一些网站登陆的时候,经常需要填写以上图片的信息. 这种图片验证方式是我们最常见的形式,它可以有效的防范恶意攻击者采用恶意工具,来进行窃取用户的密码 ...
- NKOJ4238 天天爱跑步(【NOIP2016 DAY1】)
问题描述 小C同学认为跑步非常有趣,于是决定制作一款叫做<天天爱跑步>的游戏.<天天爱跑步>是一个养成类游戏,需要玩家每天按时上线,完成打卡任务. 这个游戏的地图可以看作一棵包 ...
- 【tensorflow2.0】处理文本数据
一,准备数据 imdb数据集的目标是根据电影评论的文本内容预测评论的情感标签. 训练集有20000条电影评论文本,测试集有5000条电影评论文本,其中正面评论和负面评论都各占一半. 文本数据预处理较为 ...
- radio 单选按钮 选中多个
<input type="radio" name="a"/> <input type="radio" name=" ...
- jenkins登录信息无效,忘记密码
1.使用admin账号登陆jenkins,提示登录信息无效,请重试 原因:启动了多个jenkins服务或者所开的Jenkins服务不对 2.jenkins账号密码忘记 修改C:\Users\ASUS- ...
- 直播 | Apache Kylin & Apache Hudi Meetup
千呼万唤始出来,Meetup 直播终于来啦- 本次线上 Meetup 由 Apache Kylin 与 Apache Hudi 社区联合举办,将于 3 月 14 日晚进行直播,邀请到来自丁香园.腾讯. ...
- (js描述的)数据结构[哈希表1.2](9)
一. 优秀的哈希函数 1.快速的计算: 需要快速的计算来获得对应的hashCode(霍纳法则来减少乘除次数) 2.均匀的分布: 尽可能将元素映射到不同的位置,让元素在哈希表中均匀分布 二.哈希表的扩容 ...