熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java高級技術 >> 正文

Java多線程notify¬ifyall的區別

2013-11-23 19:44:45  來源: Java高級技術 
    當一個線程進入wait之後就必須等其他線程notify/notifyall使用notifyall可以喚醒
   
    所有處於wait狀態的線程使其重新進入鎖的爭奪隊列中而notify只能喚醒一個注意任何時候只有一個線程可以獲得鎖也就是說只有一個線程可以運行synchronized 中的代碼notifyall只是讓處於wait的線程重新擁有鎖的爭奪權但是只會有一個獲得鎖並執行
   
    那麼notify和notifyall在效果上又什麼實質區別呢?
   
    主要的效果區別是notify用得不好容易導致死鎖例如下面提到的例子
   
    public synchronized void put(Object o) {
   
    while (bufsize()==MAX_SIZE) {
   
    wait() // called if the buffer is full (try/catch removed for brevity)
   
    }
   
    bufadd(o)
   
    notify() // called in case there are any getters or putters waiting
   
    }
   
    public synchronized Object get() {
   
    // Y: this is where C tries to acquire the lock (ie at the beginning of the method)
   
    while (bufsize()==) {
   
    wait() // called if the buffer is empty (try/catch removed for brevity)
   
    // X: this is where C tries to reacquire the lock (see below)
   
    }
   
    Object o = bufremove(
   
    notify() // called if there are any getters or putters waiting
   
    return o;
   
    }所以除非你非常確定notify沒有問題大部分情況還是是用notifyall
From:http://tw.wingwit.com/Article/program/Java/gj/201311/27385.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.