1、notify要放在synchronized块中才可以,例如synchronized(someObject){someObject.notify()},那么这段代码只能唤醒someObject的线程。如果改成synchronized(someObject){someObject.notifyAll()},不也是这个作用么?两者有什么区别?
2、notify之后,被唤醒的线程能否知道是哪个具体的类的实例唤醒的自己?被唤醒的线程如何得到唤醒自己的对象实例?

解决方案 »

  1.   

    notify 是叫醒一个正在wait在我这个对象上的线程,notifyall 是叫醒这个对象上的所有线程。
      

  2.   

    2楼说的我不太明白。一个对象不是只能有一个run么?也就是一个对象只能有一个线程?例如:
    synchronized(someObject){
      someObject.notify();
    //someObject.notifyAll();
    }
    这两个不都是要唤醒someObject对象的线程么?有什么区别呢?
      

  3.   

    notify()和notifyAll()都是把某个对象上阻塞的线程唤醒,notify只能唤醒一个,但究竟是哪一个不能确定,而notifyAll则唤醒这个对象上处于阻塞中所有的线程。对于线程的控制来说,最好还是使用notifyAll()。如果想了解更多,去看下inside JVM.对于这个问题。我先纠正你在3楼的一个错误说法。并不是说对象能拥有线程。而是这个你将someObject做为临界资源来进行线程控制。someObject也有一个叫法叫做对象锁。就像几个人玩一个球一样。球就是对象锁,而人就是线程。你对应这个例子。来看你的这个问题~~注意下,一个线程是被另外一个线程来唤醒的。而不是类。也就是说。球只能从一个人手中传到另外一个人手中。