Java死锁

Posted XuGuobao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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不能被执行。这就形成了死锁。

以上是关于Java死锁的主要内容,如果未能解决你的问题,请参考以下文章

sqlserver-处理死锁

java 死锁

55行代码实现Java线程死锁

Java演示死锁代码

java synchronized 死锁问题

JAVA死锁排查-性能测试问题排查思路