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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© ☆枫の云 金牌黑马   /  2014-5-14 09:18  /  1018 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 ☆枫の云 于 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. }
复制代码

评分

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

查看全部评分

3 个回复

倒序浏览
你把锁换Test.class 和 DeadLockTest.class看下效果。
回复 使用道具 举报
本帖最后由 Tinck 于 2014-5-14 09:43 编辑

锁没有被static修饰,t1和t2各自创建的时候都在自己堆空间里生成a、b锁,所以不存在抢锁的问题。静态后两个锁在方法区里,两个线程都指向同两个锁。

评分

参与人数 1技术分 +1 收起 理由
张然龙 + 1

查看全部评分

回复 使用道具 举报 1 0
Tinck 发表于 2014-5-14 09:35
锁没有被static修饰,t1和t2各自创建的时候都在自己堆空间里生成a、b锁,所以不存在抢锁的问题。静态后两个 ...

原来是这样=.=,相当于各自都有新的锁对象,想了半天没想通,哈哈,O(∩_∩)O谢谢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马