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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 班志国 中级黑马   /  2012-11-29 13:16  /  1171 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. class Test implements Runnable{

  2.           private boolean flag;
  3.          Test(boolean flag){
  4.                 this.flag=flag;
  5.           }
  6.           public void run(){
  7.                 if(flag){
  8.                        synchronized(MyLock.locka){
  9.                                System.out.println("if locka");
  10.                                synchronized(MyLock.lockb){
  11.                                        System.out.println("if lockb");
  12.                                }
  13.                        }
  14.                 }else{
  15.                          synchronized(MyLock.lockb){
  16.                                System.out.println("else lockb");
  17.                                synchronized(MyLock.locka){
  18.                                       System.out.println("else locka");
  19.                                }
  20.                        }
  21.                 }
  22.           }

  23. }

  24. class MyLock{
  25. static Object locka = new Object();
  26.           static Object lockb = new Object();
  27. }

  28. class DeadLock{
  29.          public static void main(String[] args){
  30.                  Thread t = new Thread(new Test(true));
  31.                  Thread t1 = new Thread(new Test(false));
  32.                  t.start();
  33.                  t1.start();
  34.          }
  35. }
  36. <IMG border=0 alt="" src="http://bbs.itheima.com/forum.php?mod=image&aid=10034&size=300x300&key=56e55160dec94dd94ce315fa81f1e073&nocache=yes&type=fixnone" aid="attachimg_10034">怎么会打印出这种情况呢 求解释 求分析   我的理解 先走的是t1 这时持有的锁是lockb 然后打印一下 else lockb 那么怎么会打印 else locka呢 t1持有的锁是lockb啊  求解 啊
复制代码

1.jpg (5.99 KB, 下载次数: 17)

1.jpg

评分

参与人数 1技术分 +1 收起 理由
崔政 + 1 赞一个!

查看全部评分

5 个回复

倒序浏览
你加锁的问题,
在线程开启的时候,你的锁没有加在run()上,所以t和t1就开始抢执行权,
那你的理解就不成立了
回复 使用道具 举报
你是想写死锁吗,你不用死循环,或者sleep怎么会实现呢.
一个线程可以拿到多个锁的啊,t1拿到MyLock.lockb,打印一句
再拿到MyLock.locka打印一句执行,t1就打完收工了.
接着t执行很和谐
结果不就是你贴出来的代码吗
回复 使用道具 举报
邱峁 发表于 2012-11-29 14:57
你加锁的问题,
在线程开启的时候,你的锁没有加在run()上,所以t和t1就开始抢执行权,
那你的理解就不成 ...

一个线程 进去了 拿到的是 第一锁啊 比如 拿到 locka 那碰到 下一句synchronized(MyLock.lockb){

12.                                       System.out.println("if lockb");

13.                               }

难道 所 就换成 lockb了吗
回复 使用道具 举报
罗会涛 发表于 2012-11-29 15:15
你是想写死锁吗,你不用死循环,或者sleep怎么会实现呢.
一个线程可以拿到多个锁的啊,t1拿到MyLock.lockb,打 ...

一个线程 进去了 拿到的是 第一锁啊 比如 拿到 locka 那碰到 下一句synchronized(MyLock.lockb){

12.                                       System.out.println("if lockb");

13.                               }

难道 所 就换成 lockb了吗
回复 使用道具 举报
班志国 发表于 2012-11-29 18:21
一个线程 进去了 拿到的是 第一锁啊 比如 拿到 locka 那碰到 下一句synchronized(MyLock.lockb){

12.    ...

统统拿到手客气什么,当然是全拿
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马