黑马程序员技术交流社区

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

作者: job    时间: 2014-4-18 21:11
标题: 线程锁问题
本帖最后由 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就把他们全叫醒了,但这时它们已经在同步里面了,为什还要抢锁?锁不是在同步代码块外面抢的吗,谁抢到了谁才能进同步代码块?

作者: 闯天涯    时间: 2014-4-18 22:07
你可以这样想,如果他们不抢,应该让谁先执行?他们都有执行权,所以只能是jvm随机分配给一条,我是这样理解的,还有就是我觉得不能说是抢,说是jvm看谁顺眼就给谁这样更好一点
作者: 向日葵的曙光    时间: 2014-4-19 00:51
t0、t1、 t2、都是挂在线程池中的,而notifyAll();是唤醒线程池中的所有线程,那么谁先被唤醒当然就得排队,那些还未执行权的或者处于等待状态的都有可能被唤醒
只是看谁先抢到资源谁就有执行权,如果两个线程都处于等待状态,肯定会先执行先等待状态的那个线程。
锁就是一个对象,当一个线程处于等待状态的时候,这个锁就会打开,让别的程序来运行,谁进来了谁就开始执行线程代码。
作者: job    时间: 2014-4-19 13:47
闯天涯 发表于 2014-4-18 22:07
你可以这样想,如果他们不抢,应该让谁先执行?他们都有执行权,所以只能是jvm随机分配给一条,我是这样理解的, ...

看来只有这样理解啦!
作者: job    时间: 2014-4-19 13:49
向日葵的曙光 发表于 2014-4-19 00:51
t0、t1、 t2、都是挂在线程池中的,而notifyAll();是唤醒线程池中的所有线程,那么谁先被唤醒当然就得排队 ...

虽然看你的回答,看晕了,还是谢过了!




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