java synchronized wait
在多個線程要互斥訪問數(shù)據(jù),
但線程間需要同步時——例如任務(wù)分多個階段,特定線程負責(zé)特定階段的情況,
經(jīng)常合作使用synchronized 和 wait()
?
synchronized(b)導(dǎo)致了b上開啟了同步鎖。也就是說
只要存在 synchronized (b) 就會等待解鎖。
也就是說A里的synchronized(b) {} 就是為了防止在執(zhí)行的時候B里的synchronized(this){ } 代碼段同時執(zhí)行。
來個時間線。
1. A: synchronized (b) {
(這時候拿到b的鎖,其他同步段不能執(zhí)行,在等待中)
2.????? try {
????????? System.out.println("等待對象b完成計算。。。");
????????? b.wait();
????????? (這時候A放棄b鎖,讓B執(zhí)行)
3. B: synchronized (this) {
??????????? for (int i = 0; i < 101; i++) {
??????????????? total += i;
??????????? }
??????????? notify();
??????????? (喚醒A)
4. A:繼續(xù)執(zhí)行。
?
還可以用于方法前標示同步方法
比如:
public synchronized void methodA(){}
wait()是Object的方法,意味著所有的對象都有這個方法。
調(diào)用這個方法時表示執(zhí)行這個方法的當(dāng)前線程放棄執(zhí)行,進入等待狀態(tài),同時放棄對象鎖,其它線程就可以進入由同一個對象鎖控制的同步塊或同步方法。
wait()時會先釋放當(dāng)前線程所擁有的鎖,
當(dāng)從wait狀態(tài)返回時,會再次獲取之前的鎖,之后再執(zhí)行后續(xù)代碼。
這點由JVM保證,可查JDK文檔。
為什么wait()一定要在同步方法或同步塊中調(diào)用?
這是因為wait()命令的發(fā)出者必須首先擁有鎖,或者說只有手中持有鎖的線程才有資格等待以交出控制權(quán)。wait()/notify()這種機制的引入本身就是為了在資源獨占(表現(xiàn)為synchronized)的前提下合作,所以只有配合鎖使用才有意義。
wait()/notify()是相互協(xié)作的,剛開始怎么想也想不明白要獨占資源
現(xiàn)在想了一下,好像有點眉目了:
一個線程計算結(jié)果,另外一個線程等待結(jié)果,但是兩個線程都要訪問某個共同變量,一個線程往里放結(jié)果,另外一個線程從中取結(jié)果。上面例子的total就是共同變量。因為要訪問共同變量,所以涉及到資源獨占的問題,所以要加上synchronized關(guān)鍵字。
???
wait()促使當(dāng)前線程放棄鎖,其他等待線程可以拿到鎖了
sleep必須捕獲異常,而wait,notify和notifyAll不需要捕獲異常
?http://bbs.csdn.net/topics/330005504
?
轉(zhuǎn)載于:https://www.cnblogs.com/softidea/p/3820654.html
總結(jié)
以上是生活随笔為你收集整理的java synchronized wait的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【CCL】连通区域提取
- 下一篇: shellAPP