[英]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.