rt

解决方案 »

  1.   

    调用notifyAll方法的线程,必须已取得调用该方法的对象的内部锁,或者叫监视器。
    你可以这样理解:首先,synchronized块内要被同步访问的对象应该被设计为只被持有该内部锁的线程访问,否则任何一个线程都可以在非同步区域里改变对象的值的话,同步就没意义了。在synchronized块内wait的线程,一定在等待这里的某些对象达到某种条件。而不持有锁的线程,触及不到这些对象,无法创造使得wait的线程继续运行的条件,所以它没有资格去唤醒等待的线程。这样说你理解了吗?
      

  2.   

    notifyAll/notify必须要放在synchronized里面!
    并且和wait是成对出现的!
      

  3.   

    并且和wait是成对出现的!??
      

  4.   

    对,只有拥有对象锁的对象才能使用notify/notifyAll方法。
    怎么才能拥有对象锁?只有synchronized!
      

  5.   


    我是否可以在Synchronized中用if else写两个notifyAll?
      

  6.   

    不是成对出现,我认为是对应出现。
    1) Object obj = new Object();
    2) obj.wait();
    3) obj.notify();
    4) obj.notifyAll();调用了2)wait方法后,当前线程处于等待(暂停)状态。程序中应该有其他的线程,调用对应的3)4),以便在让运行2)的线程继续。
      

  7.   

    notifiyAll必须在synchronized里面。在synchronized的里面,当前线程已经获得某个对象内部锁,调用notifyAll时,会释放内部锁。如果notifyAll放在外部,当前线程已经释放了内部锁,就没法实现释放。
      

  8.   

    [Quote=引用 6 楼 weiluo12 的回复:]
    引用 4 楼 jinxfei 的回复:
    并且和wait是成对出现的! ?? 
    如果不是,请高手解释!
    [/Quote
    语法没有这样的规定,看你的程序吧
      

  9.   

    虽然揭帖,但我认为还是不用必须怎么样的。notify,根本不需要同步,他只是发出信号告诉大家可以来拿了,就算来了,没有找到东西也没什么。
      

  10.   


    你这个notify是释放锁的。如果都没有进入synchronized,没有获得锁,何来的释放,然后通知调度器调度别的线程,实际上notify不在synchronized中,是会抛java.lang.IllegalMonitorStateException的。