爲什麼wait()
在同步塊內?我的意思是,只有一個線程將進入同步塊,那麼另一個線程如何執行wait()
指令?爲什麼在裏面等待同步?
回答
- 同步關鍵字用於獨佔訪問。
- 要使方法同步,只需將synchronized關鍵字添加到其聲明中即可。然後,同一對象上的同步方法的任何兩次調用都可以相互交錯。
- 同步語句必須指定提供內部鎖定的對象。使用同步(this)時,您必須避免同步其他對象方法的調用。
- wait()通知調用線程放棄監視器並進入休眠狀態,直到某個其他線程進入相同的監視器並調用notify()。
- notify()喚醒在同一個對象上調用wait()的第一個線程。
例子:
public class ThreadA {
public static void main(String[] args){
ThreadB b = new ThreadB();
b.start();
synchronized(b){
try{
System.out.println("Waiting for b to complete...");
b.wait();
}catch(InterruptedException e){
e.printStackTrace();
}
System.out.println("Total is: " + b.total);
}
}
}
class ThreadB extends Thread{
int total;
@Override
public void run(){
synchronized(this){
for(int i=0; i<100 ; i++){
total += i;
}
notify();
}
}
}
得到它:http://www.programcreek.com/2009/02/notify-and-wait-example/
爲什麼'synchronized(this)'在'ThreadB'中被調用?不僅線程本身調用運行,並且沒有其他線程? – Artemkller545 2014-08-29 12:56:51
當我嘗試運行沒有這個同步塊,我得到了一個java.lang.IllegalMonitorStateException,這很有趣。當通過b同步threadA時,它需要保證notify()也被同步,或者其他實例可以調用notify。 – 2014-08-29 13:17:14
Why is wait() inside of a synchronized block?
因爲線程需要有你呼籲wait()
對象的監視器,在一個synchronized方法的情況下,this
對象。
I mean, only one thread will enter the synchronized block, so how can the other
thread execute the wait() instruction?
它不能,只有同步塊內的線程可以執行wait()
,允許其他線程進入同步塊。
「[foo。]爲什麼[需要]在[synchronized(foo)]內部等待?」你基本上說,「因爲它需要。」 _why_會更好的回答。完整的答案對於這個空間來說太大了,但簡而言之, 'foo.wait()'的調用者應該等待一些明確的,可測試的條件,並且爲了避免「丟失的通知」,可以測試或改變條件的每個代碼塊(包括服務員)應該同步同一把鎖。 Java不能強制代碼塊是同步的,但是它對等待的塊()和通知()的塊是這樣做的。 – 2014-08-29 13:19:25
- 1. java - 從等待裏面同步調用同步方法
- 2. JS異步/等待 - 爲什麼等待需要異步?
- 3. 在等待裏面另一個等待
- 4. 爲什麼我的應用程序等待同步這麼多?
- 5. 爲什麼在這裏需要同步?
- 6. 爲什麼同步上下文不能用於等待?
- 7. 爲什麼頁面不停地等待?
- 8. 爲什麼我無法通過同步等待來獲取異步等待的值?
- 9. 爲什麼異步/等待不會異步運行?
- 10. soundPool.load()裏面(等待)線程?
- 11. 爲什麼不等待?
- 12. SQLPLus等待...爲什麼?
- 13. 爲什麼等待塊Dispatcher.Invoke?
- 14. 爲什麼要等待window.onload?
- 15. 爲什麼WaitForExit()不等待?
- 16. 爲什麼在等待後HttpContext.Current爲null?
- 17. 同步中斷等待
- 18. 同步等待$ .ajax調用
- 19. 等待()/通知()同步
- 20. 同步ArrayList並等待
- 21. 爲什麼等待/通知不在這裏?
- 22. 爲什麼我在Windows上獲取NotImplementedError異步並等待?
- 23. 爲什麼要在方法中間等待異步方法?
- 24. 在異步函數中,爲什麼我必須等待?
- 25. 爲什麼必須在「異步」方法中「等待」?
- 26. 異步等待不等待
- 27. 爲什麼總是在異步操作(異步等待)中同步在asp.net mvc中
- 28. 等待一個異步回調同步
- 29. 在Web-Worker中同步等待消息
- 30. XmlPullParser同步:線程正在等待
哪'synchronized'塊你在說什麼?你的問題真的不清楚(也很廣泛)...... – BackSlash 2014-08-29 12:49:16
沒有任何答案,無論是在這裏還是在副本中,都提到了一個典型的原因:「notifyAll」將會是一團糟,無需在繼續之前重新獲得鎖定。 – 2014-08-29 13:22:18
這是因爲在你等待某件事之前,你必須確定事情還沒有發生。你必須確保它不會在你等待時發生。所以你必須持有一個鎖來等待某件事 - 這個鎖可以保護你等待狀態改變的東西。 – 2016-03-30 09:35:59