黑马程序员技术交流社区

标题: 线程 提问 [打印本页]

作者: 班志国    时间: 2012-11-29 13:16
标题: 线程 提问
  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

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

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

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

13.                               }

难道 所 就换成 lockb了吗
作者: 班志国    时间: 2012-11-29 18:21
罗会涛 发表于 2012-11-29 15:15
你是想写死锁吗,你不用死循环,或者sleep怎么会实现呢.
一个线程可以拿到多个锁的啊,t1拿到MyLock.lockb,打 ...

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

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

13.                               }

难道 所 就换成 lockb了吗
作者: 罗会涛    时间: 2012-11-29 20:50
班志国 发表于 2012-11-29 18:21
一个线程 进去了 拿到的是 第一锁啊 比如 拿到 locka 那碰到 下一句synchronized(MyLock.lockb){

12.    ...

统统拿到手客气什么,当然是全拿




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