在学习Java的道路上,是否路过多线程时总让你很迷惘;很不巧,我也是,而使我们感到很迷惘主要原因都源于没有对概念的深深的理解和实践。所以我决定漫步Java多线程,同你一起会会多线程。

多线程系列

多线程系列一:理解多线程在于深深地理解了多任务、进程、多线程、线程

多线程系列二:手撕多线程,从会三种创建多线程方式开始:除了常见的两种,你是否了解Callable接口方式?

多线程系列三:初遇并发问题:从一个小故事开始,从一行行代码开始

多线程系列四:停止多线程,你不会还以为是用stop和destroy吧?

多线程系列五:多线程为何要使用休眠?

多线程系列六:线程礼让与强制执行

多线程系列七:纯手绘图解多线程状态+代码示例,就问你怕了吗?

多线程系列八:多线程的优先级

多线程系列九:守护线程

多线程系列十:通过案例体会多线程的不安全(案例+代码示例)

1.死锁概念

多线程因竞争资源而导致两个或者多个线程僵持(相互等待),停止执行的现象。

当一个同步块同时拥有两个以上对象的锁,就可能会发生"死锁"问题。

2.故事场景

从那遥远的地方,

有两头羊要过窄窄的独木桥,分别有白羊和黑羊,

它们各自都要前往对面桥一方,

可是窄窄的桥同时只能过去一只,

所以彼此僵持…

直到狭路相逢勇者胜!

直到退一步海阔天空!

3.代码示例

3.1主方法执行

public class DemoThread {

public static void main(String[] args) {

new Thread(new Bridge(0,"白羊")).start();

new Thread(new Bridge(1,"黑羊")).start();

}

}

3.2添加白羊和黑羊

class WhiteSheep{}

class BlackSheep{}

class Bridge extends Thread{

private Integer choice;

private String name;

static WhiteSheep whiteSheep = new WhiteSheep();

static BlackSheep blackSheep = new BlackSheep();

Bridge(Integer choice , String name){

this.choice = choice;

this.name = name;

}

@Override

public void run() {

try {

Bridge();

} catch (InterruptedException e) {

e.printStackTrace();

}

}

private void Bridge() throws InterruptedException {

if (choice == 0){

synchronized (whiteSheep){

System.out.println(this.name + "前进===1");

Thread.sleep(2000);

synchronized (blackSheep){

System.out.println(this.name + "前进===2");

}

}

}else {

synchronized ( blackSheep){

System.out.println(this.name + "前进===3");

Thread.sleep(3000);

synchronized (whiteSheep){

System.out.println(this.name + "后退===4");

}

}

}

}

}

运行结果

死锁情况下,线程会彼此僵持

将同步块抽离出来,让每一个同步块独立

class Bridge extends Thread{

private Integer choice;

private String name;

static WhiteSheep whiteSheep = new WhiteSheep();

static BlackSheep blackSheep = new BlackSheep();

Bridge(Integer choice , String name){

this.choice = choice;

this.name = name;

}

@Override

public void run() {

try {

Bridge();

} catch (InterruptedException e) {

e.printStackTrace();

}

}

private void Bridge() throws InterruptedException {

if (choice == 0){

synchronized (whiteSheep){

System.out.println(this.name + "前进===1");

Thread.sleep(2000);

}

synchronized (blackSheep){

System.out.println(this.name + "前进===2");

}

}else {

synchronized ( blackSheep){

System.out.println(this.name + "前进===3");

Thread.sleep(3000);

}

synchronized (whiteSheep){

System.out.println(this.name + "后退===4");

}

}

}

}

死锁产生4个必要条件:

1.互斥条件

一个资源每次只能被一个进程使用。

2.请求与保持条件

当进程因请求资源而阻塞时,对已获得的资源保持不放

3.不剥削条件

进程已获得的资源在未使用完之前,不能剥夺,只能在使用完时由自己释放

4.环路等待条件

在发生死锁时,必然存在一个进程–资源的环形链

死锁产生4个必要条件,只需要解决一个或多个条件就可以避免死锁现象。

最后:

为了更好的阅读体验,我把想说的话都放在了下面,嘿嘿。

我是一颗剽悍的种子 把我会的,认真的分享是我写博客一直不变的信条。

如果你能看到这篇博文,说明咱们还是很有缘的;希望能带给你一些许帮助,创作的不易,把我文章的知识带走,你的三连留下,点赞,评论,关注,是我最大的动力。

java死锁业务场景_【深入浅出多线程系列十二】:什么是死锁?(场景+代码示例)...相关推荐

  1. hbase scan超时设置_深入浅出HBase系列(二)

    今天来讲讲HBase读的过程: 1.HBase读过程详解 2.1影响HBase读取命令的参数 HBase读包含两种命令:get ,基于确切的RowKey去获取一行数据,通常被称之为随机点查:scan, ...

  2. idea 线程内存_Java线程池系列之-Java线程池底层源码分析系列(二)

    课程简介: 课程目标:通过本课程学习,深入理解Java线程池,提升自身技术能力与价值. 适用人群:具有Java多线程基础的人群,希望深入理解线程池底层原理的人群. 课程概述:多线程的异步执行方式,虽然 ...

  3. kotlin杂谈系列十二(Kotlin和Java的互操作)

    Kotlin杂谈系列十二 这次就主要来谈谈kotlin和java互操作的问题 kotlin出来的使命就是为了解决java的模板问题和一些冗长的问题所以kotlin天生就很好的支持了java 所以我们在 ...

  4. Alamofire源码解读系列(十二)之请求(Request)

    本篇是Alamofire中的请求抽象层的讲解 前言 在Alamofire中,围绕着Request,设计了很多额外的特性,这也恰恰表明,Request是所有请求的基础部分和发起点.这无疑给我们一个Req ...

  5. xen是服务器虚拟化,xen虚拟化实战系列(十二)之xen虚拟机高可用之在线迁移

    xen虚拟化实战系列文章列表 xen虚拟化实战系列(十三)之xen虚拟机集中管理之convirt 1. 方案背景概述 本文是有对我们一个xen虚拟化生产环境将要改造的一个方案而来,在项目上线初期,没有 ...

  6. Reflex WMS入门系列十二:Reflex里的Location

    Reflex WMS入门系列十二:Reflex里的Location 玩过SAP系统里的人都知道,在SAP系统里库存管理分为IM Level和WM Level.IM Level的仓库,在SAP里被定义为 ...

  7. Highcharts翻译系列十二:gauge测量图

    Highcharts翻译系列十二:gauge测量图 说明 测量图需要highcharts-more.js的支持 属性 参数 描述 默认值 animation 动画 true color 主要颜色或序列 ...

  8. Web 前端开发精华文章推荐(jQuery、HTML5、CSS3)【系列十二】

    2012年12月12日,[<Web 前端开发人员和设计师必读文章>系列十二]和大家见面了.梦想天空博客关注 前端开发 技术,分享各种增强网站用户体验的 jQuery 插件,展示前沿的 HT ...

  9. java 秒杀多线程_秒杀多线程系列 - 随笔分类 - Joyfulmath - 博客园

    随笔分类 - 秒杀多线程系列 秒杀多线程系列,该系列转载至CSDN MoreWindows: http://blog.csdn.net/morewindows/article/details/7392 ...

最新文章

  1. 怎么做 空间杜宾模型_企业营销怎么做?深度解析STP模型及案例,一步成高手...
  2. 文本纠错与BERT的最新结合,Soft-Masked BERT
  3. python操作mysql_使用Python操作MySQL的一些基本方法
  4. excel中的不同类型图表叠加
  5. 机器学习中倒三角符号_机器学习的三角误差
  6. 小小智慧树机器人_国网营业厅“AI新势力”,科沃斯商用机器人解锁智慧服务新模式!...
  7. NOI入门级:基础算法 贪心法
  8. Linux Socket C语言网络编程:SCTP Socket
  9. html5 dzzxjbd cn,UEditor实现单张图片上传至腾讯云(对象存储服务)功能(html5
  10. 我一个理科生造的AI,怎么就去做历史高考题了呢?
  11. Python多分支实现四则运算器
  12. 查看app包名和启动页Activity的方法
  13. html菜鸟教程选项卡,jQuery EasyUI 布局插件 – Tabs 标签页/选项卡 | 菜鸟教程
  14. Spring5开发新功能
  15. ttl传输种过期_TTL 传输中过期2、目标主机无法访问3、请求超时4、未知主机
  16. 金丹期前期:1.4、python语言-python的程序的核心数据类型:字符串、列表、元组、字典
  17. java 生成根据图片内容生成图片包含格式有【png jepg GIF tiff wbmp】
  18. 案例:用python将中文翻译的和英文原文合成新的word文档
  19. 有两台电脑,一台电脑有线上网,另一台不能上网,如何通过飞秋或者其他软件,使得两台电脑间能互传文件
  20. win7旗舰版安装telnet,报错:打开程序包 Telnet Client 的更新 TelnetClient 失败。状态为: 0x80073712。解决方案

热门文章

  1. php 关联数组 索引,PHP 数组:索引数组与关联数组
  2. 《跨界杂谈》开源不是美女不要乱抱
  3. 使用/dev/random和/dev/urandom产生随机数
  4. Nutz Dao学习笔记
  5. Gh0stly Gh0sts:第一个 0mnichain NFT
  6. 《OpenCv视觉之眼》Python图像处理十四 :Opencv图像轮廓提取之Scharr算法和Canny算法
  7. AP统计和微积分怎么按计算器?
  8. windows桌面程序开发_每个软件开发人员都需要的6个Windows桌面实用程序
  9. 迈德威视网口相机--配置及使用
  10. android 蓝牙串口收不到数据,蓝牙作为server时 接收不到蓝牙串口模块发送的数据...