何为死锁呢?

死锁指两个或两个以上的进程在执行过程中

由于竞争资源或由于彼此通信而造成的一种阻塞的现象,如果没有外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程,在日常开发中,如果不进行合理的逻辑规划,很有可能出现死锁现象,那么我们如何避免死锁的现象发生

下文是笔者准备的死锁避免方法,如下所示:

避免死锁的方法:1.不使用synchronized这个显式的锁,而采用信号量控制资源,可被多少线程访问2.当设置资源只可被一个线程访问时,则此时为锁住状态,信号量中可设置获取的超时时间,对无法成功获取,可进行重复尝试,或指定尝试次数后,也可立即退出
例:使用信号量控制死锁
package com.java265.other;
import java.util.Date;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;
public class Test16 {public static String obj1 = "java265.com-1";public static final Semaphore a1 = new Semaphore(1);public static String obj2 = "java265.com-2";public static final Semaphore a2 = new Semaphore(1);public static void main(String[] args) {LockAa a = new LockAa();new Thread(a).start();LockBb b = new LockBb();new Thread(b).start();}
}class LockAa implements Runnable {public void run() {try {System.out.println(new Date().toString() + " LockA 开始执行");while (true) {if (Test16.a1.tryAcquire(1, TimeUnit.SECONDS)) {System.out.println(new Date().toString() + " LockA 锁住 obj1");if (Test16.a2.tryAcquire(1, TimeUnit.SECONDS)) {System.out.println(new Date().toString() + " LockA 锁住 obj2");Thread.sleep(60 * 1000); // do something} else {System.out.println(new Date().toString() + "LockA 锁 obj2 失败");}} else {System.out.println(new Date().toString() + "LockA 锁 obj1 失败");}Test16.a1.release(); // 释放Test16.a2.release();Thread.sleep(1000); // 马上进行尝试,现实情况下do something是不确定的}} catch (Exception e) {e.printStackTrace();}}
}class LockBb implements Runnable {public void run() {try {System.out.println("java265.com " + new Date().toString() + " LockB 开始执行");while (true) {if (Test16.a2.tryAcquire(1, TimeUnit.SECONDS)) {System.out.println(new Date().toString() + " LockB 锁住 obj2");if (Test16.a1.tryAcquire(1, TimeUnit.SECONDS)) {System.out.println(new Date().toString() + " LockB 锁住 obj1");Thread.sleep(60 * 1000); // do something} else {System.out.println(new Date().toString() + "LockB 锁 obj1 失败");}} else {System.out.println(new Date().toString() + "LockB 锁 obj2 失败");}Test16.a1.release(); // 释放Test16.a2.release();Thread.sleep(10 * 1000); // 这里只是为了演示,所以tryAcquire只用1秒,而且B要给A让出能执行的时间,否则两个永远是死锁}} catch (Exception e) {e.printStackTrace();}}
}-----运行以上代码,将输出以下信息-----
Thu Apr 28 23:01:32 CST 2022 LockA 开始执行
java265.com Thu Apr 28 23:01:32 CST 2022 LockB 开始执行
Thu Apr 28 23:01:32 CST 2022 LockA 锁住 obj1
Thu Apr 28 23:01:32 CST 2022 LockB 锁住 obj2
Thu Apr 28 23:01:33 CST 2022LockB 锁 obj1 失败
Thu Apr 28 23:01:33 CST 2022LockA 锁 obj2 失败
Thu Apr 28 23:01:34 CST 2022 LockA 锁住 obj1
Thu Apr 28 23:01:34 CST 2022 LockA 锁住 obj2
Thu Apr 28 23:01:43 CST 2022 LockB 锁住 obj2
Thu Apr 28 23:01:43 CST 2022 LockB 锁住 obj1
Thu Apr 28 23:02:35 CST 2022 LockA 锁住 obj1
Thu Apr 28 23:02:35 CST 2022 LockA 锁住 obj2

Java避免死锁的方法分享相关推荐

  1. java获取当前日期和时间的二种方法分享

    有两种方法: 方法一:用java.util.Date类来实现,并结合java.text.DateFormat类来实现时间的格式化,看下面代码: import java.util.*; import j ...

  2. 陈硕罡分享java的四大解析方法,陈硕罡认为java安全性

    陈硕罡分享java的四大解析方法,一起来了解java实现代码: package com.cn.单向加密; import sun.misc.BASE64Decoder; import sun.misc. ...

  3. java 替换list中值的方法分享

    转自: Java 如何更换List指定位置上的元素呢? list集合简介: 1.List接口继承Collection接口,实现了List接口的类称为List集合. 2.在List集合中允许出现重复的元 ...

  4. java飞机大战护盾_全民飞机大战无敌护盾使用方法分享

    全民飞机大战中有很多无敌护盾,无敌护盾大家都知道,我敢说有的人不会用无敌护盾,这里肯定有人嘲笑我,谁不会用,那么简单,也就你不会吧,其实我以前是不会的,最近才学会怎么正确的使用无敌护盾,现在小编我给大 ...

  5. 阿里巴巴使用Java技术干嘛_阿里巴巴java技术岗三面分享

    阿里巴巴java技术岗三面分享 今天花时间整理了阿里巴巴Java岗技术三面的资料,分给大家做参考,祝大家都能找到好工作!加油! 一面 1.自我介绍,讲讲求职意向和擅长的技能 2.Tomcat的基本架构 ...

  6. java产生死锁的主要原因_详解java中产生死锁的原因及如何避免

    1. Java中导致死锁的原因 Java中死锁最简单的情况是,一个线程T1持有锁L1并且申请获得锁L2,而另一个线程T2持有锁L2并且申请获得锁L1,因为默认的锁申请操作都是阻塞的,所以线程T1和T2 ...

  7. java迭代器在哪个包里面,java.util.LinkedList.listIterator()方法实例

    全屏 java.util.LinkedList.listIterator(int index)方法返回一个列表迭代器在此列表中的元素(按适当顺序),从列表中的指定位置. 声明 以下是java.util ...

  8. Java 程序死锁问题原理及解决方案

    原文出处: IBM developerWorks Java 语言通过 synchronized 关键字来保证原子性,这是因为每一个 Object 都有一个隐含的锁,这个也称作监视器对象.在进入 syn ...

  9. java开启线程的方法_Java有几种方法开启线程?怎么实现带有返回值的线程?

    Java有几种方法开启线程?怎么实现带有返回值的线程? 发布时间:2020-05-22 11:20:08 来源:亿速云 阅读:238 作者:Leah Java有几种方法开启线程?怎么实现带有返回值的线 ...

最新文章

  1. 中文详解phpmailer所有对象和属性
  2. 【转】XMPP_3920_最靠谱的中文翻译文档
  3. iOS下载大文件原理解析一
  4. 机器学习线性回归案例讲解_09机器学习实战之简单线性回归
  5. 简述php和web交互过程,PHP与Web页面交互操作实例分析
  6. 智伴机器人广西团队_{智伴AI机器人}陈涛广西南宁防城港城市合伙人-人工智能下一个风口精准蓝...
  7. java体系的中间件适用于go吗_golang gf框架自定义中间件实现管理界面授权
  8. core 实例化接口_实例讲解Springboot整合MongoDB进行CRUD操作的两种方式
  9. 《空中交通管理基础》-潘卫军主编-第三章-航空器和飞行高度层
  10. Java户籍管理系统的设计与实现
  11. 切片器可以设置日期格式?_如何分秒必争--浅淡时间切片器
  12. PS虚化背景突出主体
  13. CAD标注:CAD软件中如何快速进行角度尺寸标注?
  14. 团队协作的重要性: 如何提升团队成员之间的协作能力
  15. SQL学习之使用order by 按照指定顺序排序或自定义顺序排序
  16. Dictionary(字典)
  17. Android头像上传--图片转base64,后台接收到的总是null问题
  18. 吉林大学软件学院数据库系统原理复习
  19. 动态规划之扔鸡蛋(或手机)问题
  20. IP 地址的A B C类划分、区别

热门文章

  1. 记录一次idea断点进不去的解决办法和猜测原因
  2. python 之图像处理
  3. [vivo]2020届春招在线编程考试
  4. shell 为什么不让你在等号附近放空格
  5. 2018年最具影响力的20篇数据科学研究论文,盘它!
  6. 大厂的女人们:性别不是阻碍,也不是武器
  7. 什么是面向切面编程(aop)
  8. 计算机未来pdf,计算机科学理论过去、现在与未来.pdf
  9. 蓝牙耳机哪个款式好用?好用蓝牙耳机款式推荐
  10. QML知识-与Qt数据交互