Java多线程学习之路(四)—死锁(DeadLock)

1.定义

死锁就是多个线程在竞争共享资源的时候,相互阻塞,不能脱身的状态(个人理解).其实死锁一定程度上可以看成一个死循环.

举个现实生活中的例子,一个单方向的狭小的车道上,两个方向同时来了两批车流,结果在路中间相遇了,双方想要过去都必须等待对方先过去.最后两批车流只能在路中间干耗着.

在多线程编程中,如果Thread1拥有Resource1的锁,同时申请Resource2的锁,而与此同时,Thread2拥有Resource2的锁,同时申请Resource1的锁.双方都只能等待对方执行完之后释放锁才能继续执行.最终导致死锁.

2 死锁产生的必要条件(注意不是充要条件)

  1. 互斥(mutual exclusion):至少一个资源处于非共享模式,即一个资源一次只能一个线程使用
  2. 占有并等待(hold and wait):一个线程在申请一个共享资源的时候,应该至少占有一个共享资源,且不会释放
  3. 非抢占(no preemption):共享资源不能被抢占,除非当前线程完成任务后释放其对象锁
  4. 循环等待(circular wait):占有与申请产生了一个循环

强调:满足上述四个条件也不一定会产生死锁,他们只是必要条件

3.如何解决死锁

  1. 预防死锁:使得死锁根本不会产生.
  2. 避免死锁:阻止会产生死锁的操作.
  3. 允许死锁产生,破坏并恢复死锁.
  4. 忽略死锁(也称鸵鸟算法) 干脆不管它.

事实上,大部分的OS(Windows,Linux等)都选择第四条,即忽略死锁.将问题抛给应用开发人员.所以Windows出现问题,第一件事就是重启(狗头).

4.预防死锁

预防死锁其实非常简单,那就是破坏四个必要条件中的任意一个就可以了.

  • 破坏互斥:将资源设置为非互斥的,即多个线程可以同时访问.
  • 破坏占有并等待:有两种方式可以破坏 1.每个线程在执行前直接把所有需要的资源全部申请了.这样就不会执行到一半再去申请别的资源了,但是这样要求它在开始执行前就知道自己需要哪些资源. 2.每个线程在申请一个资源的时候都需要确保自己本身并没有占有其他资源,如果占有那就必须先释放已占有的资源.但是这要也可能有问题,那就也许它同时需要两个资源才能执行.
  • 破坏非抢占:有两种方式:1.如果一个已经占有了一定资源的线程申请其他资源失败,该线程原来所占有的资源就变得可以被抢占了(相当于被隐形释放了),只有当该线程获得原有资源和申请的新资源的时候才能重新运行. 2.如果一个线程Thread1正在申请一个正在被别的线程Thread2占有的资源,OS可以可以强制要求Thread2释放Thread1所需要的资源.(前提是Thread1的线程优先级更高)
  • 破坏循环等待:对所有资源类型进行完全排序,而且要求所有线程按照资源顺序进行申请,比如可以看到上文死锁的例子,如果对资源排序,并按顺序申请资源,那么Thread1和Thread2都需要Resource1和Resource2,但是只能按照先申请Resource1再申请Resource2的顺序,这样的话就不会出现这样的问题

5.恢复死锁

6.忽略死锁

Java多线程学习之路(四)---死锁(DeadLock)相关推荐

  1. Java多线程学习二十四:阻塞队列包含哪些常用的方法?add、offer、put 等方法的区别?

    阻塞队列包含哪些常用的方法,以及 add,offer,put 等方法的区别. 在阻塞队列中有很多方法,而且它们都非常相似,所以非常有必要对这些类似的方法进行辨析,所以本课时会用分类的方式,和你一起,把 ...

  2. Java多线程学习三十四:使用 Future 有哪些注意点?Future 产生新的线程了吗

    Future 的注意点 1. 当 for 循环批量获取 Future 的结果时容易 block,get 方法调用时应使用 timeout 限制 对于 Future 而言,第一个注意点就是,当 for ...

  3. java多线程学习笔记。

    java多线程学习笔记 线程的优缺点: 多线程的好处: 充分利用多处理核心,提高资源的利用率和吞吐量. 提高接口的响应效率,异步系统工作. 线程的风险: 安全危险(竞争条件):什么坏事都没有发生.在没 ...

  4. Java多线程学习(二)synchronized关键字(1)

    转载请备注地址: https://blog.csdn.net/qq_34337272/article/details/79655194 Java多线程学习(二)将分为两篇文章介绍synchronize ...

  5. 【转】Java 多线程学习

    原网址:https://www.cnblogs.com/yjd_hycf_space/p/7526608.html Java多线程学习(总结很详细!!!) 此文只能说是java多线程的一个入门,其实J ...

  6. 转:Java多线程学习(总结很详细!!!)

    Java多线程学习(总结很详细!!!) 此文只能说是java多线程的一个入门,其实Java里头线程完全可以写一本书了,但是如果最基本的你都学掌握好,又怎么能更上一个台阶呢? 本文主要讲java中多线程 ...

  7. java线程学习,GitHub - zksir/thread: Java多线程学习

    Java多线程学习 threadcoreknowledge包----线程核心知识基础 createthreads包 创建线程 1.实现多线程的方法是1种还是2种还是4种? Oracle官方:2种,一种 ...

  8. Java多线程学习 (超详细总结)

    Java多线程学习 一.概要 二. JAVA 线程实现/创建方式 2.1 继承Thread 类 2.2 实现 Runnable 接口 2.3 Thread和Runnable的区别 2.4 总结 三.线 ...

  9. java多线程学习-java.util.concurrent详解

    http://janeky.iteye.com/category/124727 java多线程学习-java.util.concurrent详解(一) Latch/Barrier 博客分类: java ...

最新文章

  1. 《CCNP TSHOOT 300-135认证考试指南》——6.4节SVI故障检测与排除
  2. LaTeX 简介与安装
  3. MyEclipse常用配置图解
  4. how to make Membership header extension fields editable
  5. 十四个方法提高博客的页面访问量
  6. bootstrapTable表格格式化日期后,IE浏览器显示不正常,为NaN-NaN-NaN
  7. linux源代码剖析之include-asm
  8. 【http协议2】 深入理解HTTP协议
  9. MariaDB用户管理
  10. LRU页面置换算法C语言实现
  11. 《编程之美》---求二叉树中节点的最大距离
  12. 国二office计算机基础知识,国二office计算机基础知识选择题
  13. UA PHYS515 电磁理论II 静电场问题7 柱坐标系中的Laplace方程与Bessel函数
  14. 教程:如何制作一个可控制的人体骨骼模型
  15. ecshop二次开发手册【基本结构】
  16. RabbitMQ(二) | 消息可靠性(消息确认机制、消息持久化、消息重试机制)
  17. 设计模式之禅【六大设计原则】
  18. 米兔机器人终于拼完了_米兔机器人上手组装如果你不会拼装或拆卸建议收藏
  19. 外贸业务员如何开发出更多的有效客户?
  20. Matlab应变片仿真,应变片组的命名规则

热门文章

  1. error C2501: 'GetDocument' : missing storage-class or type specifiers 问题的处理
  2. 有哪些去除pdf水印的方法?说几个思路
  3. 'Webdings' 的字体对照表
  4. cpu z for linux,【CPU-Z和搜狗输入法 For Linux哪个好用】CPU-Z和搜狗输入法 For Linux对比-ZOL下载...
  5. 一个人赶着鸭子去每个村庄卖,每经过一个 村子卖去所赶鸭子的一半又一只。 这样他经过了 七个村子后还剩 两只鸭子,问问他出发时共赶多少只鸭子?经过每个村子卖出多少只鸭子?(递归实现)
  6. html我们的爱情故事,520我们的爱情故事
  7. selenium +python自动化测试发QQ空间说说
  8. Ubuntu上传源代码到自己的远程Github账户 (即Git Push)
  9. 浅谈static_cast、dynamic_cast、const_cast、reinterpret_cast用法
  10. 汇聚瞩目 耀然开启!DTC2022第二届数字孪生城市建设与产业发展高峰论坛