日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java synchronized wait

發(fā)布時間:2023/12/20 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java synchronized wait 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

在多個線程要互斥訪問數(shù)據(jù),
但線程間需要同步時——例如任務(wù)分多個階段,特定線程負責(zé)特定階段的情況,
經(jīng)常合作使用synchronized 和 wait()

/*** * 計算輸出其他線程鎖計算的數(shù)據(jù)* @author **/ public class Main {public static void main(String[] args) {ThreadB b = new ThreadB();b.start();// 啟動計算線程synchronized (b) {try {System.out.println("等待對象b完成計算...");// 當(dāng)前線程A等待 b.wait();} catch (InterruptedException e) {e.printStackTrace();}System.out.println("b對象計算的總和是:" + b.total);}} } public class ThreadB extends Thread {int total;public void run() {synchronized (this) {for (int i = 0; i < 101; i++) {total += i;} //計算操作結(jié)束 notify();//喚醒在此對象監(jiān)視器上等待的單個線程,在本例中線程A被喚醒 }} }

?

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。