• 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不能被执行。这就形成了死锁。

  • 相关阅读:
    bzoj 5092: [Lydsy1711月赛]分割序列
    bzoj1173: [Balkan2007]Point
    bzoj1536: [POI2005]Akc- Special Forces Manoeuvres
    bzoj2178: 圆的面积并
    bzoj1043 下落的圆盘
    bzoj2674 Attack
    bzoj1201: [HNOI2005]数三角形
    bzoj3135: [Baltic2013]pipesd
    bzoj1760 [Baltic2009]Triangulation
    bzoj3136
  • 原文地址:https://www.cnblogs.com/XuGuobao/p/7223208.html
Copyright © 2020-2023  润新知