List list = null;
public void endWorking() {
endFlag = true;
try {
synchronized (list) {
list.notify();  //这有用吗?
for (; !emailList.isEmpty(); ){
// do some work
list.remove(0);
}
}
} catch (Exception e) {
log.error("Error happened when finish sending.", e);
}
}问题:当前线程获得list的管理权后,进入synchronized块(list),
然后list.notify();唤醒其他线程,这有意义吗?因为即使线程被唤醒,他还是不能获得list的权限,所以这个操作时没有意义的!不知道我的理解对不对?

解决方案 »

  1.   

    他是在产生结果之前,即进入synchronized (list)后,马上notify!
    然后才进行业务处理的!for (; !emailList.isEmpty(); ){
    // do some work
    list.remove(0);
    }
      

  2.   

    当然有意义,当调用notify的时候,其它线程被唤醒,这个时候它的确还不可能获得list的锁但是如果你不调用notify,那么其它线程连醒都不醒过来,也无法去竞争锁了。Java中规定调用obj.notify时必须已经获得obj的锁(否则必然会出现死锁情况),所以上述代码是必须的