黑马程序员技术交流社区

标题: 什么时候产生死锁,该怎么办? [打印本页]

作者: sishuidliunian    时间: 2016-5-30 17:27
标题: 什么时候产生死锁,该怎么办?
以前有人发过解答,但有些复杂看不懂。程序如下
  1. package com.itheima;

  2. public class Demo10 {
  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.         public void run() {
  25.                 String name = Thread.currentThread().getName();
  26.                 System.out.println(name + " 1111 " + obj1);
  27.                 synchronized (obj1) {
  28.                         System.out.println(name + " 2222 " + obj1);
  29.                         work();
  30.                         System.out.println(name + " 3333 " + obj2);
  31.                         synchronized (obj2) {
  32.                                 System.out.println(name + " 4444 " + obj2);
  33.                                 work();
  34.                         }
  35.                         System.out.println(name + " released lock on " + obj2);
  36.                 }
  37.                 System.out.println(name + " released lock on " + obj1);
  38.                 System.out.println(name + " finished execution.");
  39.         }

  40.         private void work() {
  41.                 try {
  42.                         Thread.sleep(30000);
  43.                 } catch (InterruptedException e) {
  44.                         e.printStackTrace();
  45.                 }
  46.         }
  47. }
复制代码
  1. t1 1111 java.lang.Object@7943f708
  2. t1 2222 java.lang.Object@7943f708
  3. t2 1111 java.lang.Object@51733472
  4. t2 2222 java.lang.Object@51733472
  5. t3 1111 java.lang.Object@c01b05e
  6. t3 2222 java.lang.Object@c01b05e
  7. t1 3333 java.lang.Object@51733472
  8. t2 3333 java.lang.Object@c01b05e
复制代码
谁能帮我分析下过程





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2