A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

© 马上都有 中级黑马   /  2014-5-20 15:52  /  1169 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文


  1. public class DeadLock implements Runnable {
  2.         Object locka=new Object();
  3.         Object lockb=new Object();
  4.         @Override
  5.         public void run() {
  6.         while(true){
  7.                 synchronized (locka) {
  8.                         System.out.println("11locka");
  9.                         synchronized (lockb) {
  10.                                 System.out.println("11lockb");
  11.                         }
  12.                 }
  13.                 synchronized (lockb) {
  14.                 System.out.println("22lockb");
  15.                 synchronized (locka) {
  16.                         System.out.println("22locka");
  17.                 }
  18.                 }
  19.         }

  20.         }
  21. }

  22. public class Test {

  23.         public static void main(String[] args) {
  24.                 DeadLock dk=new DeadLock();
  25.                 Thread t1=new Thread(dk,"aa");
  26.                 Thread t2=new Thread(dk,"bb");
  27.                 t1.start();
  28.                 t2.start();        
  29.         }
  30. }
  31. 这样也可以死锁,但是在while里面线程为什么可以直接去走第二个锁
复制代码


评分

参与人数 1技术分 +1 收起 理由
天涯追梦 + 1

查看全部评分

2 个回复

倒序浏览
应该是第一线程去一个锁走出来了 然后进了第二个锁 然后 第二个说又进来了 进了第一个锁吧
回复 使用道具 举报
稍微修改了下输出语句,为了看的直观一点
输出结果:
Thread[t1,5,main]---------|11locka
Thread[t1,5,main]---------|11lockb
Thread[t1,5,main]---------|22lockb
Thread[t2,5,main]---------|11locka


当t1线程执行完while中的
synchronized (locka) {
                        System.out.println(Thread.currentThread()+"---------|"+"11locka");
                        synchronized (lockb) {
                                System.out.println(Thread.currentThread()+"---------|"+"11lockb");
                        }
                }
执行完毕后 释放了 locka 和lockb

进入了 synchronized (lockb) {
                System.out.println(Thread.currentThread()+"---------|"+"22lockb");
               //执行到这里时 t2线程进入while 执行的第一部分 t1持有lockb 请求locka  t2持有locka 请求lockb 所以发生死锁
                synchronized (locka) {
                        System.out.println(Thread.currentThread()+"---------|"+"22locka");
                }
}

评分

参与人数 1技术分 +1 收起 理由
天涯追梦 + 1 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马