要點
wait()
執行前在呼叫wait()之前,必須先要獲得物件鎖,即只有在同步方法或者同步**塊中呼叫wait()方法。
執行作用
wait()使程序進入等待(阻塞狀態),在收到通知或者被中斷之前都會進入預執行佇列。
執行之後1
執行wait()之後,當前執行緒釋放改物件鎖,在通知前與其他執行緒重新競爭資源
執行之後2
執行wait()之後,如果沒有使用notify()通知其他執行緒,即使該物件資源空閒,其他使用過wait()執行緒由於沒有通知會繼續阻塞直到這個物件發出notify或者notifyall
/wait()是object物件的方法。 要點
notify()
執行前在呼叫notify()之前,必須先要獲得物件鎖,即只有在同步方法或者同步**塊中呼叫notify()方法。
執行作用
通知乙個等待該物件資源的執行緒進入就緒狀態,如果有多個執行緒等待,怎有執行緒規劃器來挑選乙個進入就緒狀態(區別notify和notifyall)
執行之後
執行notify之後,當前執行緒並不會立即釋放鎖,只有當執行完sychronized方法或者**塊的時候,當前執行緒才會釋放鎖
/notify()是object物件的方法。
針對上面的鎖釋放不釋放,來做乙個小的例子
先做wait()之後鎖立即釋放
package com.myobject;
public
class object1 catch (interruptedexception e) }}
}
package com.mythread;
import com.myobject.object1;
public
class
thread1a
extends
thread
@override
public
void
run()
}
package com.mythread;
import com.myobject.object1;
public
class
thread1b
extends
thread
@override
public
void
run()
}
package com.test;
import com.mythread.thread1a;
import com.mythread.thread1b;
public
class test1
}
列印結果
wait begin
wait begin
下面是驗證notify()之後鎖不立即釋放
package com.myobject;
public
class object1 catch (interruptedexception e) }}
public
void
mothd2(object lock) catch (interruptedexception e) }}
}
package com.mythread;
import com.myobject.object1;
public
class
thread1a
extends
thread
@override
public
void
run()
}
package com.mythread;
import com.myobject.object1;
public
class
thread1b
extends
thread
@override
public
void
run()
}
package com.test;
import com.mythread.thread1a;
import com.mythread.thread1b;
public
class test1
}
列印結果
a wait begin 1453090470087
bnotify begin 1453090471088
bnotify end 1453090476088
a wait end 1453090476088
說明notify必須在執行完synchronized同步方法或者同步**塊之後才釋放鎖
package com.myobject;
public
class object2 catch (interruptedexception e) }}
}
package com.mythread;
import com.myobject.object2;
public
class
thread2
extends
thread
@override
public
void
run()
}
package com.test;
import com.mythread.thread2;
public
class test2
}
當執行緒處於wait()時,呼叫執行緒物件的interrupt()會出現interruptedexception
總結:釋放鎖的時刻有
1)同步**完成
2)丟擲異常或者return
3)wait()方法
11 等待 通知(wait notify)機制介紹
1.當兩個執行緒主動地讀取乙個共享變數時,在花費讀取時間的基礎上,讀取到的值是不是想要的,並不能完全確定,等待 通知 機制就用來滿足這樣的需求。2.wait 的作用是使當前執行的執行緒進行等待。呼叫之前要獲取物件級別鎖,即只能在同步方法中或者同步塊中呼叫。執行wait 方法後,當前執行緒釋放鎖,在從...
《多執行緒程式設計》學習之七 等待 通知機制(一)
今天起開始學習執行緒之間的通訊。等待 通知機制是通過object類的wait 與notify 方法來實現的,這兩個方法在同步方法或同步 塊中才能被執行。wait 方法將當前執行緒放入 等待執行佇列 中,使執行緒在wait 方法所處 處停止執行,直到被喚醒或者被中斷為止,執行wait 方法會釋放物件鎖...
等待 通知機制
waitnotify模式的注意事項 經典案例生產者消費者模式實現 實戰等待通知之交叉備份 舉例說明,廚師和服務員之間的互動 1.廚師做完一道菜的時間不確定,所以廚師將菜品放到 菜品傳遞臺 上的時間也不確定 2.服務員取到菜的時間取決於廚師,所以服務員就處於等待狀態 3.服務員如何取到菜呢?又得取決於...