Java死锁

代码如下:

 1 package com.synchronizeddemo01;
 2
 3 class Zhangsan{
 4     public void say(){
 5         System.out.println("张三对李四说:“你给我画,我就把书给你”。");
 6     }
 7     public void get(){
 8         System.out.println("张三得到了画。");
 9     }
10 }
11 class Lisi{
12     public void say(){
13         System.out.println("李四对张三说:“你给我书,我就把画给你”。");
14     }
15     public void get(){
16         System.out.println("李四得到了书。");
17     }
18 }
19
20 public class ThreadDeadLock extends Thread {
21     private static Zhangsan zs = new Zhangsan();
22     private static Lisi ls = new Lisi();
23     private boolean flag = false;
24     public void run(){
25         if(flag){
26             synchronized (zs) {
27                 zs.say();;
28                 try{
29                     Thread.sleep(500);
30                 }catch(InterruptedException e){
31                     e.printStackTrace();
32                 }
33                 synchronized (ls) {
34                     zs.get();
35                 }
36             }
37         }else{
38             synchronized (ls) {
39                 ls.say();
40                 try{
41                     Thread.sleep(500);
42                 }catch(InterruptedException e){
43                     e.printStackTrace();
44                 }
45                 synchronized (zs) {
46                     ls.get();
47                 }
48             }
49         }
50     }
51     public static void main(String[] args) {
52         ThreadDeadLock t1 = new ThreadDeadLock();
53         ThreadDeadLock t2 = new ThreadDeadLock();
54         t1.flag = true;
55         t2.flag = false;
56         Thread thA = new Thread(t1);
57         Thread thB = new Thread(t2);
58         thA.start();
59         thB.start();
60     }
61
62 }

输出结果为:

张三对李四说:“你给我画,我就把书给你”。
李四对张三说:“你给我书,我就把画给你”。

分析:根据本人博客http://www.cnblogs.com/XuGuobao/p/7201715.html中的叙述:防止多个线程同时执行同一个对象的同步代码段。

可以认为,每一个synchronized都对应一个线程,也就是说,每一个对象的synchronized代码块,在执行完全之前,不允许别的线程或者对象参与进来,所以,上边嵌套的synchronized中,synchronized块中的synchronized不能被执行。这就形成了死锁。

时间: 2024-08-25 04:56:46

Java死锁的相关文章

Java死锁举例

死锁: 在多线程竞争使用共享资源的情况下,就有可能出现死锁的情况.比如,当一个线程等待另一个线程所持有的锁时,那个线程又可能在等待第一个线程所持有的锁.此时,这两个线程会陷入无休止的相互等待状态,这种情况就称为死锁. 产生死锁的四个必要条件: 1.互斥条件.进程对所分配的资源进行排它性控制,即在一段时间内某资源仅为一进程所占有. 2.请求和保持条件.当进程因请求资源而阻塞时,对已获得的资源保持不放. 3.不剥夺条件.进程已获得的资源,在未使用完之前,不能被剥夺,只能在使用完时由自己释放. 4.环

Java死锁范例以及如何分析死锁(转载自ImportNew)

本文由 ImportNew - 范琦琦 翻译自 journaldev.欢迎加入翻译小组.转载请见文末要求. 死锁是两个甚至多个线程被永久阻塞时的一种运行局面,这种局面的生成伴随着至少两个线程和两个或者多个资源.在这里我已写好一个简单的程序,它将会引起死锁方案然后我们就会明白如何分析它. Java死锁范例 ThreadDeadlock.java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29

Java死锁排查和Java CPU 100% 排查的步骤整理

工欲善其事,必先利其器 简介 本篇整理两个排查问题的简单技巧,一个是java死锁排查,这个一般在面试的时会问到,如果没有写多线程的话,实际中遇到的机会不多:第二个是java cpu 100%排查,这个实际的开发中,线的应用出现这个问题可能性比较大,所以这里简单总结介绍一下,对自己学习知识的一个整理,提高自己的解决问题能力. 一.Java死锁排查 通过标题我们就要思考三个问题: 什么是死锁? 为什么会出现死锁? 怎么排查代码中出现了死锁? 作为技术人员(工程师),在面对问题的时候,可能需要的能力是

Java死锁演示

Java死锁演示 在线程中嵌套获取锁导致死锁.思路,尽量不要嵌套获取锁. package com.mozq.demo.demo; public class DeadLockDemo { private static String A = "A"; private static String B = "B"; public static void main(String[] args) { new DeadLockDemo().deadLock(); } privat

Java 死锁及解决方法

死锁是这样一种情形:多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放.由于线程被无限期地阻塞,因此程序不可能正常终止. java 死锁产生的四个必要条件: 1>互斥使用,即当资源被一个线程使用(占有)时,别的线程不能使用 2>不可抢占,资源请求者不能强制从资源占有者手中夺取资源,资源只能由资源占有者主动释放. 3>请求和保持,即当资源请求者在请求其他的资源的同时保持对原有资源的战友. 4>循环等待,即存在一个等待队列:P1占有P2的资源,P2占有P3的资源,P3占有P

Java死锁排查和Java CPU 100% 排查的步骤整理(转)

工欲善其事,必先利其器 简介 本篇整理两个排查问题的简单技巧,一个是java死锁排查,这个一般在面试的时会问到,如果没有写多线程的话,实际中遇到的机会不多:第二个是java cpu 100%排查,这个实际的开发中,线的应用出现这个问题可能性比较大,所以这里简单总结介绍一下,对自己学习知识的一个整理,提高自己的解决问题能力. 一.Java死锁排查 通过标题我们就要思考三个问题: 什么是死锁? 为什么会出现死锁? 怎么排查代码中出现了死锁? 作为技术人员(工程师),在面对问题的时候,可能需要的能力是

java 死锁

死锁检测方法 1 JConsole 找到需要查看的进程,打开线程选项卡,点击检测死锁 2 jps查看java进程ID,使用jstack  7412输出信息 3 使用jvisualvm连接java虚拟机,查看线程检测死锁 解决方法: 四个条件打破一个即可,但是代价不同,最简单的编码就是顺序加锁和解锁 现在我们介绍下如何避免死锁的几个常见方法.<java变发编程的艺术> 避免一个线程同时获取多个锁. 避免一个线程在锁内同时占用多个资源,尽量保证每个锁只占用一个资源. 尝试使用定时锁,使用tryLo

如何通过编程发现Java死锁

本文由 ImportNew - rookie_sam 翻译自 Dzone.欢迎加入翻译小组.转载请见文末要求. 死锁是指,两个或多个动作一直在等待其他动作完成而使得所有动作都始终处在阻塞的状态.想要在开发阶段检测到死锁是非常困难的,而想要解除死锁往往需要重新启动程序.更糟的是,死锁通常发生在负载最重的生产过程中,而想要在测试中发现它,十分不易.之所以这么说,是因为测试线程之间所有可能的交叉是不现实的.尽管出现了一些静态分析库可以帮助我们发现可能出现的死锁,我们还是有必要在运行时检测到死锁,并且得

Java死锁的理解

我们有时候操作数据库的时候会遇到死锁,那么什么使死锁呢?它的一个比较官方的定义就是:死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程.我们也可以通过下面一个小故事来进行简单的理解.就是说吧有两个人他们在一起吃饭,但是呢,筷子不够,A这个人有一支筷子,B这个人也有一支筷子,加入A要吃饭的时候,B把筷子给了A,这样A就吃上了饭,同理B要吃饭的时

一个简答的java死锁

在实际编程中,要尽量避免出现死锁的情况,但是让你故意写一个死锁的程序时似乎也不太简单(有公司会出这样的面试题),以下是一个简单的死锁例子,程序说明都写着类的注释里了,有点罗嗦,但是应该也还是表述清楚了的. [code=java] /*** 一个简单的死锁类* @author iStar* 当类的对象flag=1时(T1),先锁定O1,睡眠500毫秒,然后锁定O2:* 而T1在睡眠的时候另一个flag=0的对象(T2)线程启动,先锁定O2,睡眠500毫秒,等待T1释放O1:* T1睡眠结束后需要锁