并发线程之间的死锁通常发生在同步代码块的相互嵌套使用的过程中,下面先来看段代码:

package cn.sunzn.synchronize;public class DeadLock {public static void main(String[] args) {final Object lock1 = new Object();final Object lock2 = new Object();/** 线程 0 **/new Thread() {public void run() {synchronized (lock1) {System.out.println(Thread.currentThread().getName() + ":1");synchronized (lock2) {System.out.println(Thread.currentThread().getName() + ":2");}}};}.start();/** 线程 1 **/new Thread() {public void run() {synchronized (lock2) {System.out.println(Thread.currentThread().getName() + ":3");synchronized (lock1) {System.out.println(Thread.currentThread().getName() + ":4");}}};}.start();}
}

以上的代码在程序运行过程中开启了 2 个并发线程,线程 0 和线程 1 中同时嵌套使用同步代码块,大多数情况下程序能依次在屏幕上输出:

Thread-0:1
Thread-0:2
Thread-1:3
Thread-1:4

对于以上容易理解的运行结果不进行解释,下面看另一种运行结果:

Thread-0:1
Thread-1:3

下面我们对这个运行结果进行分析:首先前提条件线程 0 和线程 1 同时开启,CPU 切换到线程 0,打印输出 Thread-0:1,这时 CPU 切换到 线程 1 打印输出 Thread-1:3, 当线程 1 继续执行内部的同步代码块的时候发现内部的同步代码块和线程 0 的外部同步代码块使用了相同的锁对象 lock1,所以线程 1 会等待 CPU 切换到线程 0 等待与之同步的代码执行完毕,当线程 0 重新获取到 CPU 资源继续执行自身内部的同步代码块的时候发现线程 1 中的外部同步代码块和它具有同样的锁对象 lock2,所以线程 0 就会等待 CPU 切换到线程 1 等待与之同步的代码执行完毕,而这时线程 1 也在等待线程 0 的执行完毕,2 组代码相互等待,出现死锁。

Java 编程下的并发线程之间的同步代码块死锁相关推荐

  1. 单例设计模式八种方式——5) 懒汉式(线程安全,同步代码块) 6) 双重检查 7) 静态内部类 8) 枚举

    懒汉式(线程安全,同步代码块)应用实例 优缺点说明: 1) 这种方式,本意是想对第四种实现方式的改进,因为前面同步方法效率太低, 改为同步产生实例化的的代码块 2) 但是这种同步并不能起到线程同步的作 ...

  2. 黑马毕向东Java课程笔记(day11):多线程(第一部分)——进程与线程+线程创建+线程安全与同步代码块+同步锁/死锁

    多线程好文:添加链接描述 锁机制:synchronized.Lock.Condition.volatile(原子性可见性)--参考添加链接描述 1.进程与线程概述   首先,对于CPU执行每一个程序, ...

  3. 第三次学JAVA再学不好就吃翔(part116)--同步代码块

    学习笔记,仅供参考,有错必纠 文章目录 多线程 设置线程的优先级 同步代码块 什么情况下需要同步 同步代码块 死锁 多线程 设置线程的优先级 设置线程优先级: package com.guiyang. ...

  4. 0037 Java学习笔记-多线程-同步代码块、同步方法、同步锁

    什么是同步 在上一篇0036 Java学习笔记-多线程-创建线程的三种方式示例代码中,实现Runnable创建多条线程,输出中的结果中会有错误,比如一张票卖了两次,有的票没卖的情况,因为线程对象被多条 ...

  5. java同步方法同步块_java 同步代码块与同步方法

    同步代码块 synchronized(obj) {//代码块 } obj 为同步监视器,以上代码的含义为:线程开始执行同步代码块(中的代码)之前,必须先获得对同步监视器的锁定. 代码块中的代码是执行代 ...

  6. JAVA多线程下高并发的处理经验

    java中的线程:java中,每个线程都有一个调用栈存放在线程栈之中,一个java应用总是从main()函数开始运行,被称为主线程.一旦创建一个新的线程,就会产生一个线程栈.线程总体分为:用户线程和守 ...

  7. Java 编程下的同步代码块

    为了便于理解先来看看没有加同步代码块的 2 组同样功能的代码在不同状态下的执行结果,下面看第一组: package cn.wangjwei.synchronize;public class Synch ...

  8. 编程开发之--java多线程学习总结(2)同步代码块

    1.第一种解决办法:同步代码块,关键字synchronized package com.lfy.ThreadsSynchronize;/*** 1.使用同步代码块* 语法:synchronized ( ...

  9. Java Singleton类中的线程安全性的示例代码

    Java Singleton类中的线程安全性的示例代码 Singleton是最广泛使用的创建设计模式之一,用于限制应用程序创建对象.在实际应用程序中,数据库连接或企业信息系统(EIS)等资源是有限的, ...

最新文章

  1. tomcat生成catalina.out文件
  2. C++类对象的拷贝构造函数(转载)
  3. java学习笔记6--类的继承、Object类
  4. flutter Web打包
  5. layui 数据表格下拉框_layui-table-column-select(layui数据表格可搜索下拉框select)
  6. Java认证授权框架Spring Security介绍
  7. DevOps面试问题
  8. [CB] 支付宝区块链的应用- 区块链发票医保理赔.
  9. java消除整型数组中重复的元素,排序后输出新数组
  10. spark读取gz文件与parquet文件
  11. fastble找不到手机_Android蓝牙库FastBle的基础入门使用
  12. 山东建筑大学计算机考研率,山东建筑大学考研难吗
  13. 圣笛数控联手国促会数外委打造OID物联新高地
  14. 数据处理笔记6:缺失值填充
  15. 如果一个人没有明确的目标,他的人生就像是一艘没有罗盘的船
  16. 在开发板上显示彩虹c语言(800*480屏幕)
  17. 用python绘制叠加等边三角形_python 叠加等边三角形的绘制
  18. 信息系统安全导论第六章之软件安全
  19. 软件项目管理MOOC(北邮)——第一章测试答案
  20. 在面试时,向面试官介绍项目的基本要点

热门文章

  1. networkx 点的属性_在NetworkX中分配节点属性时发生类型错误
  2. 不想做科技第一的金融公司,不是好的养老去处
  3. 【吊炸天】TensorFlow什么的都弱爆了,强者只用Numpy搭建神经网络
  4. Linux系列在线培训五月盛情开幕!!(5月9日,10日,16日,17日,23日,24日)18:30 - 21:30,
  5. arduino彩灯计时器电路_蓝牙彩灯再升级(加音乐播放功能)
  6. python简易发红包_学习python:练习5.简单红包程序
  7. 历史上杀伤力最大的笑话!!!
  8. 尝试一种新的生命状态
  9. 小米4391人获1.749亿股股票的激励
  10. 蚂蚁森林:国庆节前组织网友去阿拉善等三地参与秋季验收