线程死锁:

a线程锁定了1号资源,下一步需要锁定2号资源。

b线程锁定了2号资源,下一步需要锁定1号资源。

两个线程无限制的等待下去,于是就出现了死锁。

引用网上的实例:

package test;public class TestDeadLock extends Thread {static Object o1 = new Object(), o2 = new Object();int flag = 0;public void run() {if(flag == 0){synchronized (o1) {System.out.println("a锁定了刀,想要叉");try {this.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}synchronized (o2){System.out.println("a 要叉成功");}}}if(flag == 1){synchronized (o2) {System.out.println("b锁定了叉,想要刀");try {this.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}synchronized (o1){System.out.println("b 要刀成功");}}}}public static void main(String[] args) {TestDeadLock tdl1 = new TestDeadLock();TestDeadLock tdl2 = new TestDeadLock();tdl1.flag = 0;tdl2.flag = 1;tdl1.start();tdl2.start();}
}

避免死锁的方法:

1.让所有的线程按照同样的顺序获得一组锁。这种方法消除了a和b的拥有者分别等待对方的资源的问题。

2.将多个锁组成一组并放到同一个锁下。前面Java线程死锁的例子中,可以创建一个银器对象的锁。于是在获得刀或叉之前都必须获得这个银器的锁。

3.将那些不会阻塞的可获得资源用变量标志出来。当某个线程获得银器对象的锁时,就可以通过检查变量来判断是否整个银器集合中的对象锁都可获得。如果是,它就可以获得相关的锁,否则,就要释放掉银器这个锁并稍后再尝试。

修改方法1:

package test;public class TestDeadLock extends Thread {static Object o1 = new Object(), o2 = new Object();int flag = 0;String threadName;public TestDeadLock(String threadName){this.threadName = threadName;}/*** 把两个方法合并到一个同步块中*/public synchronized void getCanju(){System.out.println(threadName+"锁定了刀,想要叉");try {this.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(threadName+"要叉成功");}public void run() {getCanju();}public static void main(String[] args) {TestDeadLock tdl1 = new TestDeadLock("线程1");TestDeadLock tdl2 = new TestDeadLock("线程2");tdl1.start();tdl2.start();}
}

转载于:https://www.cnblogs.com/bestdata/archive/2013/02/01/3199794.html

java线程死锁研究相关推荐

  1. java线程死锁_Java线程死锁–案例研究

    java线程死锁 本文将描述从在IBM JVM 1.6上运行的Weblogic 11g生产系统中观察到的最新Java死锁问题的完整根本原因分析. 此案例研究还将证明掌握线程转储分析技能的重要性: 包括 ...

  2. Java线程死锁–案例研究

    本文将描述从在IBM JVM 1.6上运行的Weblogic 11g生产系统中观察到的最新Java死锁问题的完整根本原因分析. 此案例研究还将证明掌握线程转储分析技能的重要性: 包括用于IBM JVM ...

  3. java线程死锁_Java并发:隐藏线程死锁

    java线程死锁 大多数Java程序员熟悉Java线程死锁概念. 它本质上涉及2个线程,它们彼此永远等待. 这种情况通常是平面(同步)或ReentrantLock(读或写)锁排序问题的结果. Foun ...

  4. linux查看java线程死锁_ccriticalsection 多线程 死锁_c++ 线程死锁_linux 线程 死锁

    qq_407283393122018-12-10 一个很蠢的造成死锁的问题 wanglt3113172018-12-12 什么是死锁,死锁的原因,如何避免 apanying902019-01-09 c ...

  5. java 线程死锁简单例子_java 多线程死锁详解及简单实例

    java 多线程死锁 相信有过多线程编程经验的朋友,都吃过死锁的苦.除非你不使用多线程,否则死锁的可能性会一直存在.为什么会出现死锁呢?我想原因主要有下面几个方面: (1)个人使用锁的经验差异 (2) ...

  6. Java 线程死锁及如何避免死锁介绍

    线程死锁 1. 什么是线程死锁 2. 死锁产生的原因 3. 如何避免线程死锁. 1. 什么是线程死锁 死锁是指两个或两个以上的线程在执行过程中,因争夺资源而造成的互相等待的现象,在无外力作用的情况下, ...

  7. 解决Java线程死锁问题及代码实例

    一.问题分析 1.什么是死锁? "死锁"是多线程中出现问题的一种情况,即:多个线程因竞争资源.进程推进顺序等原因而导致各进程同时被阻塞的情形,被阻塞的进程中一个或全部处于等待某个资 ...

  8. java线程死锁 cpu 100%_一文学会Java死锁和CPU 100% 问题的排查技巧

    做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开 工欲善其事,必先利其器 00 本文简介 作为一名搞技术的程序猿或者是攻城狮,想必你应该是对下面这两个问题有所了解,说不定你在 ...

  9. Java线程死锁模拟

    本文由广州疯狂软件java培训分享: 1,关于死锁的理解 死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况. 2,模拟死锁 背景介绍:我们创建一 ...

  10. java线程状态研究

    按照官方的说明java 的thread 有以下几种状态: NEW RUNNABLE BLOCKED WAITING TIMED_WAITING TERMINATED 会发现通过jstack 打印出来的 ...

最新文章

  1. ML之SVM:随机产生100个点,建立SVM模型,找出超平面方程
  2. 华为LTE 模块AT 命令拨号上网流程
  3. 分享一个centos不错的镜像库
  4. JavaScript特点、优缺点及常用框架
  5. python process返回值_如何恢复传递给multiprocessing.Process的函数的返回值?
  6. linux alias命令
  7. 勤哲cad服务器注册机,勤哲CAD服务器
  8. android 限制后台进程,不超过4个进程 开发者选项,后台允许不超
  9. 独家放送!搞定大屏可视化,深得老板心的大屏在这里
  10. GitHub 的 Pull Request 是指什么意思
  11. Vue的ESLint-stylelint-prettier联合配置
  12. 一文了解各种无线通信 - NB-IOT、LoRa、433、GPRS、4G、WIFI、2.4G、PKE
  13. linux下的office 速度慢,Microsoft office2016打开很慢解决
  14. android按返回键和Home键都进入后台
  15. Android漏洞查询
  16. 邮件服务器 web管理,修改Webmail地址 - 邮件服务器Webmail地址(无限用户¥2200)
  17. 第二节-Javascript和jQuery笔记
  18. 项目记录——为沙特客户Android开发Google地图应用
  19. 广东省第三届强网杯Writeup
  20. parent.location.href和location.href区别

热门文章

  1. Unity Camera
  2. JDBC09 CLOB文本大对象
  3. adminlte中datatable中自定义搜索和导出按钮
  4. Centos7 Kubernetes(k8s) 开发服务器(单服务器)部署 路由 IngressRoute【traefik2.X】
  5. EasyUI 收藏夹(私藏)
  6. WebService /php soap 相关调用 收藏
  7. Android 四大组件 之 活动(Activity)
  8. Spring Boot_打造企业级微信点餐系统_汇总贴
  9. 阶段3 3.SpringMVC·_03.SpringMVC常用注解_8 SessionAttributes注解
  10. 阶段3 2.Spring_07.银行转账案例_10 使用动态代理实现事务控制