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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© job 中级黑马   /  2014-4-18 21:11  /  1255 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 job 于 2014-4-20 21:55 编辑
  1. class Demo
  2. {

  3.         void show()
  4.         {
  5.                 synchronized(this)//
  6.                 {
  7.                  
  8.                         wait();//t0 t1 t2
  9.                
  10.                 }
  11.         }
  12.         void method()
  13.         {
  14.                 synchronized(this)//t3
  15.                 {
  16.                         notifyAll();
  17.                 }//t3
  18.         }
  19. }
复制代码
这个问题是当时毕老师说过的,可我还是没弄明白。t0、t1、t2都挂在同步里面了,t3一个notifyAll就把他们全叫醒了,但这时它们已经在同步里面了,为什还要抢锁?锁不是在同步代码块外面抢的吗,谁抢到了谁才能进同步代码块?

评分

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

查看全部评分

4 个回复

倒序浏览
你可以这样想,如果他们不抢,应该让谁先执行?他们都有执行权,所以只能是jvm随机分配给一条,我是这样理解的,还有就是我觉得不能说是抢,说是jvm看谁顺眼就给谁这样更好一点
回复 使用道具 举报
t0、t1、 t2、都是挂在线程池中的,而notifyAll();是唤醒线程池中的所有线程,那么谁先被唤醒当然就得排队,那些还未执行权的或者处于等待状态的都有可能被唤醒
只是看谁先抢到资源谁就有执行权,如果两个线程都处于等待状态,肯定会先执行先等待状态的那个线程。
锁就是一个对象,当一个线程处于等待状态的时候,这个锁就会打开,让别的程序来运行,谁进来了谁就开始执行线程代码。

评分

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

查看全部评分

回复 使用道具 举报
闯天涯 发表于 2014-4-18 22:07
你可以这样想,如果他们不抢,应该让谁先执行?他们都有执行权,所以只能是jvm随机分配给一条,我是这样理解的, ...

看来只有这样理解啦!
回复 使用道具 举报
向日葵的曙光 发表于 2014-4-19 00:51
t0、t1、 t2、都是挂在线程池中的,而notifyAll();是唤醒线程池中的所有线程,那么谁先被唤醒当然就得排队 ...

虽然看你的回答,看晕了,还是谢过了!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马