[Java] Java死锁范例以及如何分析死锁 →→→→→进入此内容的聊天室

来自 , 2021-03-09, 写在 Java, 查看 155 次.
URL http://www.code666.cn/view/ca759101
  1. package com.journaldev.threads;
  2. public class ThreadDeadlock {
  3.     public static void main(String[] args) throws InterruptedException {
  4.         Object obj1 = new Object();
  5.         Object obj2 = new Object();
  6.         Object obj3 = new Object();
  7.         Thread t1 = new Thread(new SyncThread(obj1, obj2), "t1");
  8.         Thread t2 = new Thread(new SyncThread(obj2, obj3), "t2");
  9.         Thread t3 = new Thread(new SyncThread(obj3, obj1), "t3");
  10.         t1.start();
  11.         Thread.sleep(5000);
  12.         t2.start();
  13.         Thread.sleep(5000);
  14.         t3.start();
  15.     }
  16. }
  17. class SyncThread implements Runnable{
  18.     private Object obj1;
  19.     private Object obj2;
  20.     public SyncThread(Object o1, Object o2){
  21.         this.obj1=o1;
  22.         this.obj2=o2;
  23.     }
  24.     @Override
  25.     public void run() {
  26.         String name = Thread.currentThread().getName();
  27.         System.out.println(name + " acquiring lock on "+obj1);
  28.         synchronized (obj1) {
  29.          System.out.println(name + " acquired lock on "+obj1);
  30.          work();
  31.          System.out.println(name + " acquiring lock on "+obj2);
  32.          synchronized (obj2) {
  33.             System.out.println(name + " acquired lock on "+obj2);
  34.             work();
  35.         }
  36.          System.out.println(name + " released lock on "+obj2);
  37.         }
  38.         System.out.println(name + " released lock on "+obj1);
  39.         System.out.println(name + " finished execution.");
  40.     }
  41.     private void work() {
  42.         try {
  43.             Thread.sleep(30000);
  44.         } catch (InterruptedException e) {
  45.             e.printStackTrace();
  46.         }
  47.     }
  48. }
  49.  
  50. t1 acquiring lock on java.lang.Object@6d9dd520
  51. t1 acquired lock on java.lang.Object@6d9dd520
  52. t2 acquiring lock on java.lang.Object@22aed3a5
  53. t2 acquired lock on java.lang.Object@22aed3a5
  54. t3 acquiring lock on java.lang.Object@218c2661
  55. t3 acquired lock on java.lang.Object@218c2661
  56. t1 acquiring lock on java.lang.Object@22aed3a5
  57. t2 acquiring lock on java.lang.Object@218c2661
  58. t3 acquiring lock on java.lang.Object@6d9dd520
  59.  
  60.  
  61. public void run() {
  62.     String name = Thread.currentThread().getName();
  63.     System.out.println(name + " acquiring lock on " + obj1);
  64.     synchronized (obj1) {
  65.         System.out.println(name + " acquired lock on " + obj1);
  66.         work();
  67.     }
  68.     System.out.println(name + " released lock on " + obj1);
  69.     System.out.println(name + " acquiring lock on " + obj2);
  70.     synchronized (obj2) {
  71.         System.out.println(name + " acquired lock on " + obj2);
  72.         work();
  73.     }
  74.     System.out.println(name + " released lock on " + obj2);
  75.     System.out.println(name + " finished execution.");
  76. }
  77.  

回复 "Java死锁范例以及如何分析死锁"

这儿你可以回复上面这条便签

captcha