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