黑马程序员技术交流社区

标题: 为什么我的死锁不能触发? [打印本页]

作者: ☆枫の云    时间: 2014-5-14 09:18
标题: 为什么我的死锁不能触发?
本帖最后由 ☆枫の云 于 2014-5-14 16:15 编辑

请大神看下下面的代码,我没有按照毕老师讲的新建了锁类然后调用
  1. class MyLock
  2. {
  3.         static Object locka = new Object();
  4.         static Object lockb = new Object();
  5. }
复制代码


就直接在Test中建了两个object的对象充当锁,但是就是锁不住,为什么?求大神解释。

  1. class Test implements Runnable{
  2.         private boolean flag;

  3.         Object locka = new Object();//建立锁locka
  4.         Object lockb = new Object();//建立锁lockb

  5.         Test(boolean flag){
  6.                 this.flag = flag;
  7.         }
  8.         
  9.         //除了锁用的和毕老师的不一样,其他都一样,为什么我的死锁就是无法触发。

  10.         public void run(){
  11.                 if(flag){
  12.                         while(true){
  13.                                 synchronized(locka){
  14.                                         System.out.println(Thread.currentThread().getName()+"if locka");
  15.                                         synchronized(lockb){
  16.                                                 System.out.println(Thread.currentThread().getName()+"if lockb");
  17.                                         }
  18.                                 }
  19.                         }
  20.                 }else{
  21.                         while(true){
  22.                                 synchronized(lockb){
  23.                                         System.out.println(Thread.currentThread().getName()+"if lockb");
  24.                                         synchronized(locka){
  25.                                                 System.out.println(Thread.currentThread().getName()+"if locka");
  26.                                         }
  27.                                 }
  28.                         }
  29.                 }
  30.         }
  31. }

  32. class DeadLockTest
  33. {
  34.         public static void main(String[] args)
  35.         {
  36.                 Thread t1 = new Thread(new Test(true));
  37.                 Thread t2 = new Thread(new Test(false));

  38.                 t1.start();
  39.                 t2.start();
  40.         }
  41. }
复制代码

作者: skill20    时间: 2014-5-14 09:26
你把锁换Test.class 和 DeadLockTest.class看下效果。
作者: Tinck    时间: 2014-5-14 09:35
本帖最后由 Tinck 于 2014-5-14 09:43 编辑

锁没有被static修饰,t1和t2各自创建的时候都在自己堆空间里生成a、b锁,所以不存在抢锁的问题。静态后两个锁在方法区里,两个线程都指向同两个锁。
作者: ☆枫の云    时间: 2014-5-14 12:28
Tinck 发表于 2014-5-14 09:35
锁没有被static修饰,t1和t2各自创建的时候都在自己堆空间里生成a、b锁,所以不存在抢锁的问题。静态后两个 ...

原来是这样=.=,相当于各自都有新的锁对象,想了半天没想通,哈哈,O(∩_∩)O谢谢




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