java多线程中的死锁情况读书笔记
多线程中的死锁
在前面的分析中,我们知道一个对象可以用Synchronized方法或者其他的加锁形式来防止别的任务在互斥还没有释放的时候就访问这个对象。
试想一下这样的情况:某个任务在等待另一个任务,而后者又在等待别的任务,这样一直下去,知道这个链条的任务又在等待第一个任务释放锁,任务之间的互相等待形成了循环,没有一个任务可以执行下去,最终所有的任务都阻塞,形成了死锁。
下面实例中,给出两个静态的资源,线程1先获取obj1对象,在获取obj2对象;线程2先获取obj2对象,再获取obj1对象
/**
* 设计一个简单的死锁。
* 首先明白什么叫死锁:两个线程同时占有一个资源。
* @author Xia
*
*/
public class DreadThread implements Runnable{ //两个静态的资源
public static Object obj1 = new Object();
public static Object obj2 = new Object(); //标志位,flag 等于不同的值时执行不同的代码
public int flag = 1; //1 or 2 public DreadThread(int flag) {
this.flag = flag;
} @Override
public void run() {
if(flag == 1) { //如果flag等于1,则该线程先获取obj1,在获取obj2
synchronized (obj1) {
System.out.println("flag: " + flag + ", 锁住了资源obj1");
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("flag: " + flag + ", 等待获取资源obj2");
synchronized (obj2) {
System.out.println("flag: " + flag + ", 获得资源obj2");
}
}
} else if(flag == 2) { //如果flag等于2,则该线程先获取obj2,再获取obj1
synchronized (obj2) {
System.out.println("flag: " + flag + ", 锁住了资源obj2");
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("flag: " + flag + ", 等待获取资源obj1");
synchronized (obj1) {
System.out.println("flag: " + flag + ", 获得资源obj1");
}
}
}
}
}
线程的测试类:
public class DreadThreadTest {
public static void main(String[] args) {
DreadThread thread1 = new DreadThread(1);
DreadThread thread2 = new DreadThread(2);
//启动线程1
new Thread(thread1).start();
new Thread(thread2).start();
}
}
效果:如图所示,程序一直都无法结束。这就是所谓的死锁。

java多线程中的死锁情况读书笔记的更多相关文章
- Java多线程中的死锁
Java多线程中的死锁 死锁产生的原因 线程死锁是指由两个以上的线程互相持有对方所需要的资源,导致线程处于等待状态,无法往前执行. 当线程进入对象的synchronized代码块时,便占有了资源,直到 ...
- Java多线程中的死锁问题
Java程序基本都要涉及到多线程,而在多线程环境中不可避免的要遇到线程死锁的问题.Java不像数据库那么能够检测到死锁,然后进行处理,Java中的死锁问题,只能通过程序员自己写代码时避免引入死锁的可能 ...
- java多线程中的死锁、活锁、饥饿、无锁都是什么鬼?
死锁.活锁.饥饿是关于多线程是否活跃出现的运行阻塞障碍问题,如果线程出现了这三种情况,即线程不再活跃,不能再正常地执行下去了. 死锁 死锁是多线程中最差的一种情况,多个线程相互占用对方的资源的锁,而又 ...
- Java 多线程中的死锁概述
死锁 死锁的定义 发生在并发中 当两个线程(或更多)线程(或线程)相互持有对方所需要的资源,又不主动释放,导致所有线程都无法继续执行,是程序陷入无尽的阻塞,这就是死锁. 如果多个线程之间的依赖关系是环 ...
- Java多线程编程实战指南 设计模式 读书笔记
线程设计模式在按其有助于解决的多线程编程相关的问题可粗略分类如下. 不使用锁的情况下保证线程安全: Immutable Object(不可变对象)模式.Thread Specific Storage( ...
- Java多线程——线程的死锁
Java多线程——线程的死锁 摘要:本文主要介绍了Java多线程中遇到的死锁问题. 部分内容来自以下博客: https://www.cnblogs.com/wy697495/p/9757982.htm ...
- 《Java并发编程的艺术》读书笔记:二、Java并发机制的底层实现原理
二.Java并发机制底层实现原理 这里是我的<Java并发编程的艺术>读书笔记的第二篇,对前文有兴趣的朋友可以去这里看第一篇:一.并发编程的目的与挑战 有兴趣讨论的朋友可以给我留言! 1. ...
- java多线程中的三种特性
java多线程中的三种特性 原子性(Atomicity) 原子性是指在一个操作中就是cpu不可以在中途暂停然后再调度,既不被中断操作,要不执行完成,要不就不执行. 如果一个操作时原子性的,那么多线程并 ...
- java多线程中并发集合和同步集合有哪些?区别是什么?
java多线程中并发集合和同步集合有哪些? hashmap 是非同步的,故在多线程中是线程不安全的,不过也可以使用 同步类来进行包装: 包装类Collections.synchronizedMap() ...
随机推荐
- Linux常用基本命令(tail )
tail命令 作用:从文件的尾部查看,跟head命令作用相反,参数也差不多,默认显示后面10行 格式: tail [option] [file] -n : 显示行数 -c<字节数> gho ...
- POJ3264(KB7-G RMQ)
Balanced Lineup Time Limit: 5000MS Memory Limit: 65536K otal Submissions: 52651 Case Time Limit: 2 ...
- 2.logback+slf4j+janino 配置项目的日志输出
作者QQ:1095737364 QQ群:123300273 欢迎加入! 1.创建项目 参考:http://www.cnblogs.com/yysbolg/p/6898453.html 2 ...
- BZOJ5322: [JXOI2018]排序问题
传送门 不难看出期望就是 \(\frac{(n+m)!}{\prod_{v=1}^{max}(cnt_v!)}\),\(cnt_v\) 表示 \(v\) 这个数出现的次数. 贪心就是直接把 \(m\) ...
- CSS隐藏多余的文字
效果: <p><strong>商品名称:</strong>新鲜现摘云南绥江半边红李子甜脆脱骨李6斤当季绿色有机水果包邮</p></div> ...
- Fit项目分页组件的编写
项目中涉及列表显示的地方都会用到分页控件,为了能更好地与当前网站的样式匹配,这次要自己实现一个. 所以选择了模板中提供的分页样式,基于模板改造以能够动态生成: 一 控件的行为规则 a) 可设置显示几个 ...
- android 性能优化 -- 启动过程 冷启动 热启动
一.应用的启动方式 通常来说,启动方式分为两种:冷启动和热启动. 1.冷启动:当启动应用时,后台没有该应用的进程,这时系统会重新创建一个新的进程分配给该应用,这个启动方式就是冷启动. 2.热启动:当启 ...
- Expo大作战(十五)--expo中splash启动页的详细机制
简要:本系列文章讲会对expo进行全面的介绍,本人从2017年6月份接触expo以来,对expo的研究断断续续,一路走来将近10个月,废话不多说,接下来你看到内容,讲全部来与官网 我猜去全部机翻+个人 ...
- CSS盒模型详解(图文教程)
本文最初发表于博客园,并在GitHub上持续更新.以下是正文. 盒子模型 前言 盒子模型,英文即box model.无论是div.span.还是a都是盒子. 但是,图片.表单元素一律看作是文本,它们并 ...
- gradle中的compileSdkVersion和buildToolsVersion
CompileSdkVersion:编译版本,就是运行这个项目需要的SDK,即API Level. buildToolsVerson:是构建工具的版本,构建工具包括了打包工具aapt.dx等等. 注意 ...