线程最大的缺点就是不可知,易出错(你千万不要以为自己弄懂了).
其实同步保护的作用在方法执行完毕后也就失去了,通过notify()可以协调线程之间的作用,它的确需要一些开销.但是,如果你不使用,那么有可能出现线程之间的冲突(注意,是有可能).所以作为一个程序,安全性和健壮性是非常重要的

解决方案 »

  1.   

    书上说的:
    notifyAll()让等待某个对象K的所有线程离开阻塞状态,
    notify()随机地选取等待某个对象K的线程,让它离开阻塞状态。
      

  2.   

    notify()及notifyAll()是Object的方法,与Object的wait()方法配合使用,而且这三个方法必须在同步块中调用.如下:
    在线程1中执行如下代码
    ...
    synchronized(obj1)      //1.进入同步块
    {
        try {
        ...
        obj1.wait();        //2.进入暂停状态
        }catch (InterruptedException exp) {}
    }1.当前同步对象(monitor)为obj1,obj1是任一实例,若是同步方法,则同步对象是this.进入同步块后,obj1为锁定状态,锁定状态对obj1本身无任何影响,而其它线程执行到同一代码时,因不能获得锁,处于Block状态,一旦解锁,被block的线程自动继续执行.
    2.调用obj1.wait()有两个作用,一是使线程进入等待状态,二是解锁obj1,这时被block的线程将获得锁.线程1要退出等待必须要由其它线程显式的调用obj1.notify()或notifyAll()方法.如...
    synchronized(obj1)
    {
        ...
        obj1.notify();    //3. 向wait的线程发通知信息
        ...
    }
    ...若其它线程执行到此时,线程1处于wait状态,则wait状态解除,解除后,若线程1若得到锁就能继续执行,若有多个线程处于obj1的wait状态,notify将随机选一个线程激活,而notifyAll是同时解除所有的wait状态.
      

  3.   

    notify(),notifyAll()非常有用,在一个synchronized(lockObj)块中当调用lockObj.wait()时,线程就已经将锁放开来了,这时当另外一个线程调用lockObj.notify()时,等待的线程就会继续执行下去了。这是一种非常高效的线程同步机制。如果没有他,用sleep()来同步的话就太浪费时间了。
    一个简单的例子:
    thread1 receive data
    thread2 pase received data 
    lockObj是buf
    当buf中没有数据时,thread2中调用buf.wait释放锁,让thread1有机会执行。
    当thread1收到数据时,调用buf.notify()通知thread1去处理收到的数据。
      

  4.   

    我想问的是,如果线程没有调用notify或者notifyAll而直接退出synchronized块,那么其他在这个被synchronized保护的对象上等待的线程是否也会得到通知而去试图获得该对象的锁?
    我做的实验好象能证明这一点,所以我就不明白,既然不调用notify也能给其他线程使用对象的机会,那么调用和不调用notify的区别究竟在哪里?
    网友 hh_fwhy(凤舞凰扬) 的回答颇令我满意,但是我希望得到的答案能量化一点。如果今晚之前还没有其他高手帮忙,那么这就结分啦。
      

  5.   

    如果在同步块入口点阻塞,不须其它线程调用notify(),调了也没效果,同步块能自动获得锁如果是wait造成了阻塞,须用notfiy()激活,这两个方法是配合使用