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() ...
随机推荐
- Spring、Springmvc整合web的web.xml配置
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http:// ...
- Navicat11全系列激活工具和使用方法
Navicat特别好使,但是就是得注册,在网上看到了一个激活工具,成功激活了Navicat...工具链接地址是.. https://files.cnblogs.com/files/miantiaoan ...
- Angular 6.X CLI(Angular.json) 属性详解
Angular CLI(Angular.json) 属性详解 简介 angular cli 是angular commond line interface的缩写,意为angular的命令行接口.在an ...
- 让一个小div在另一个大div里面 垂直居中的四种方法
方法一 .parent { width:800px; height:500px; border:2px solid #000; position:relative; } .child { width: ...
- MyEclipse tomcat jsk配置--- jvm blind 异常
-Xms1200m -Xmx1200m -XX:PermSize=64M-XX:MaxPermSize=256m-XX:ReservedCodeCacheSize=48m-Dcom.sun.manag ...
- css实现3D立方体旋转特效
先来看运行后出来的效果 它是在不停运行的一个立方体 先来看html部分的代码 <div class="rect-wrap"> <!--舞台元素,设置perspec ...
- SQLServer 远程链接MySql数据库详解
SQLServer 远程链接MySql数据库详解 by:授客 QQ:1033553122 测试环境: Microsoft Windows XP Professional 版本2000 Service ...
- Oracle 修改oracle数据库名
Oracle 修改oracle数据库名 by:授客 QQ:1033553122 1.确保你有个可用于数据库恢复的,完整的数据库备份 2.确保数据库处于mount,非open状态,并且在加载前先以imm ...
- JavaScript函数节流(throttle)与函数去抖(debounce)
对于浏览器窗口大小改变的时候,来动态改变页面元素的大小,可以采用window的resize事件,实现代码: <script type="text/javascript"> ...
- python unnitest 经验总结
由于我的用例是数据驱动,每个用例保存为一个txt或者xls文件,执行时候需要读取文件,并将所有变量实例化成一个用例: 之前自己设计了框架,由于考虑需要生成一个美观通用的报告格式(原格式都是手写的htm ...