簡體   English   中英

兩種同步方式的區別

[英]Difference between two synchronization methods

I have a doubt that is somewhat confusing me in java thread synchronization, if I have a shared memory zone, what is the difference between using wait/notify/notifyAll in the synchronized methods and declaring an Object (Object myObj) and using myObj.wait ,據我了解,兩者在某種程度上都達到了相同的效果。

換句話說:這

public class ThreadSignal{
    protected boolean isDataAvailable = false;
    public void synchronized waitUntilComplete(){
       if(isDataAvailable == false){
           wait();
       }
    }
    public void synchronized complete(){
       isDataAvailable = true;
       notify();
    }
}

與這個

private Object notEmpty = new Object();
private Object notFull = new Object();
public synchronized E take() {
        //some code
            notEmpty.wait()
        //some code
        notFull.notifyAll();
}

區別在於第一個鎖定整個 object 因此沒有其他線程可以訪問該共享區域,而在第二個中,我們可以更靈活地鎖定我們想要鎖定的內容?

第二個問題,因為將其放在評論中很難(為其編輯主要帖子):

我有一個問題我試圖解決並找出構建 class 的最佳方法,問題如下有一個機場有一個隊列(共享區域)和三個線程(飛行員、女主人和乘客),女主人基本上是檢查從機場進來。

乘客首先進入隊列等待女主人的操作 checkDocuments(因此進入阻塞/等待狀態),然后出示機票並等待女主人的操作 waitForNextPassenger 進入飛機內。 另一方面,女主人被乘客的操作 waitInQueue 喚醒(當它第一次進入隊列時),檢查乘客然后進入另一個等待 state 等待乘客文件然后檢查乘客。

鑒於此,我已經定義了這些阻塞變量: waitInQueue checkDocuments shownDocuments waitForNextPassenger

鑒於您在評論中所說的,我想一個好的方法是將這些中的每一個都設為 object,例如在線程乘客生命周期中,它將調用等待 object checkDocuments (checkDocuments.wait) 和女主人會例如 checkDocuments.notify

這是一個正確的方法嗎?

同步方法:

public void synchronized f() {...}

等同於:

public void f() {
  synchronized(this) {
  ...
  }
}

這不同於:

private Object obj=new Object()

public void f() {
  synchronized(obj) {
    ...
   }
}

同步方法使用this ,這意味着在同一 object 上工作的任何其他同步方法將等待當前同步方法返回。 當您將單獨的 object 與同步塊一起使用時,同步塊將等到使用相同 object 的當前同步塊退出。 因此,使用第二種方法,您可以執行以下操作:

public void f() {
   synchronized(obj) {
     ...
   }
   // Do stuff
   synchronized(obj) {
    ...
   }
}

也就是說,您可以以更精細的方式控制互斥。

第二種方法還允許您鎖定多個對象。

當您使用第二種方法時,您必須小心wait / notify 如果您持有obj的鎖,則可以調用obj.wait() ,這意味着您處於同步塊synchronized(obj)中。 當調用wait時,同步塊將放棄對 object 的鎖定。 然后,另一個線程可以使用obj.notify()向等待線程發送通知。

暫無
暫無

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

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