簡體   English   中英

是否在同步塊中但在wait()之后以同步方式運行代碼?

[英]Do code inside a synchronized block but after wait() runs in synchronized way?

我想知道編寫在同步塊中的代碼,但是在wait()語句實際上以同步方式運行之后還是不像在wait()期間那樣,放棄了鎖,一旦線程被通知,它就再次需要鎖。

public void process(){
    synchronized(sharedObj){
        try{
             sharedObj.wait();
        }catch(InterruptedException ex){
              ex.printStackTrace();
        }
        // when wait is over do the line below runs in synchronized way. It is inside synchronized block but during call of wait(), lock was relinquished. 
        sharedObj.writeValue();
    }
}

請幫助我澄清我的疑問。

此致克里希納

http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#wait()

線程釋放此監視器的所有權,並等待直到另一個線程通過調用notify方法或notifyAll方法通知等待在此對象監視器上等待的線程喚醒。 然后,線程等待,直到它可以重新獲得監視器的所有權並恢復執行。

是的,它重新獲得了鎖定。

的確,要使線程成功調用對象的wait()方法,線程必須保留該對象的監視器,並且在執行wait()必須放棄該監視器。 但是,也確實是線程在從wait()返回之前重新獲取該監視器。 您不需要做任何特殊的事情就可以做到這一點。

也許您對以下事實感到困惑:執行wait()的線程在停止等待之后可能需要與其他人爭奪監視器,但是您不必擔心; 它發生在wait()返回之前。 同步塊的完整性保持不變:始終可以確保在其中執行的代碼確保沒有其他線程持有同步對象的監視器,包括在執行wait()之后。

根據Javadoc

線程釋放此監視器的所有權,並等待直到另一個線程通過調用notify方法或notifyAll方法通知等待在此對象監視器上等待的線程喚醒。 然后,線程等待,直到它可以重新獲得監視器的所有權並恢復執行。

因此,是的,當wait調用返回時,該線程將擁有監視器,這意味着它正在“以同步方式”運行(沒有其他線程能夠執行該代碼塊或任何其他同步的代碼塊)在當前線程離開synchronized塊之前使用相同的sharedObj )。

順便說一句,同樣根據Javadoc, wait應該總是在循環中調用,因為wait可能由於其他原因(而不是notify您正在等待的notify而中斷。

例如:

public void process(){
    synchronized(sharedObj){
        while(!sharedObj.valueCanBeWritten()) {
            try{
                sharedObj.wait();
            }catch(InterruptedException ex){
              ex.printStackTrace();
            }
        }
        sharedObj.writeValue();
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM