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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java wait 释放锁_JAVA锁之wait,notify(wait会释放锁,notify仅仅只是通知,不释放锁)...

發布時間:2025/3/12 编程问答 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java wait 释放锁_JAVA锁之wait,notify(wait会释放锁,notify仅仅只是通知,不释放锁)... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

wait是指在一個已經進入了同步鎖的線程內,讓自己暫時讓出同步鎖,以便其他正在等待此鎖的線程可以得到同步鎖并運行,只有其他線程調用了notify方法(notify并不釋放鎖,只是告訴調用過wait方法的線程可以去參與獲得鎖的競爭了,但不是馬上得到鎖,因為鎖還在別人手里,別人還沒釋放),調用wait方法的一個或多個線程就會解除wait狀態,重新參與競爭對象鎖,程序如果可以再次得到鎖,就可以繼續向下運行。

1)wait()、notify()和notifyAll()方法是本地方法,并且為final方法,無法被重寫。

2)當前線程必須擁有此對象的monitor(即鎖),才能調用某個對象的wait()方法能讓當前線程阻塞,

(這種阻塞是通過提前釋放synchronized鎖,重新去請求鎖導致的阻塞,這種請求必須有其他線程通過notify()或者notifyAll()喚醒重新競爭獲得鎖)

3)調用某個對象的notify()方法能夠喚醒一個正在等待這個對象的monitor的線程,如果有多個線程都在等待這個對象的monitor,則只能喚醒其中一個線程;

(notify()或者notifyAll()方法并不是真正釋放鎖,必須等到synchronized方法或者語法塊執行完才真正釋放鎖)

4)調用notifyAll()方法能夠喚醒所有正在等待這個對象的monitor的線程,喚醒的線程獲得鎖的概率是隨機的,取決于cpu調度

例子1(錯誤使用導致線程阻塞):三個線程,線程3先擁有sum對象的鎖,然后通過sum.notify()方法通知等待sum鎖的線程去獲得鎖,但是這個時候線程1,2并沒有處于wait()導致的阻塞狀態,而是在synchronized方法塊處阻塞了,所以,這次notify()根本沒有通知到線程1,2。然后線程3正常結束,釋放掉sum鎖,這個時候,線程1就立刻獲得了sum對象的鎖(通過synchronized獲得),然后調用sum.wait()方法釋放掉sum的鎖,線程2隨后獲得了sum對象的線程鎖(通過synchronized獲得),這個時候線程1,2都處于阻塞狀態,但是悲催的是,這之后再也沒有線程主動調用sum.notify()或者notifyAll()方法顯示喚醒這兩個線程,所以程序阻塞

public class CyclicBarrierTest {

public static void main(String[] args) throws Exception {

final Sum sum=new Sum();

new Thread(new Runnable() {

@Override

public void run() {

try {

synchronized (sum) {

System.out.println("thread3 get lock");

sum.sum();

sum.notifyAll(); //此時喚醒沒有作用,沒有線程等待

Thread.sleep(2000);

System.out.println("thread3 really release lock");

}

} catch (Exception e) {

e.printStackTrace();

}

}

}).start();

new Thread(new Runnable() {

@Override

public void run() {

try {

synchronized (sum) {

System.out.println("thread1 get lock");

sum.wait();//主動釋放掉sum對象鎖

System.out.println(sum.total);

System.out.println("thread1 release lock");

}

} catch (Exception e) {

e.printStackTrace();

}

}

}).start();

new Thread(new Runnable() {

@Override

public void run() {

try {

synchronized (sum) {

System.out.println("thread2 get lock");

sum.wait(); //釋放sum的對象鎖,等待其他對象喚醒(其他對象釋放sum鎖)

System.out.println(sum.total);

System.out.println("thread2 release lock");

}

} catch (Exception e) {

e.printStackTrace();

}

}

}).start();

}

}

class Sum{

public Integer total=0;

public void sum() throws Exception{

total=100;

Thread.sleep(5000);

}

}

thread3 get lock

thread3 really release lock

thread2 get lock

thread1 get lock

//程序后面一直阻塞

例子2:還是上面程序,順序不同,把線程3放到最下面。最后線程1,2都因為沒有再次獲得線程導致線程阻塞

運行過程:

線程1先運行獲得sum對象鎖(通過synchronized),但是隨后執行了sum.wait()方法,主動釋放掉了sum對象鎖,然后線程2獲得了sum對象鎖(通過synchronized),也通過sum.wait()失去sum的對象鎖,最后線程3獲得了sum對象鎖(通過synchronized),主動通過sum.notify()通知了線程1或者2,假設是1,線程1重新通過notify()/notifyAll()的方式獲得了鎖,然后執行完畢,隨后線程釋放鎖,然后這個時候線程2成功獲得鎖,執行完畢。

public class CyclicBarrierTest {

public static void main(String[] args) throws Exception {

final Sum sum=new Sum();

new Thread(new Runnable() {

@Override

public void run() {

try {

synchronized (sum) {

System.out.println("thread1 get lock");

sum.wait();//主動釋放sum對象鎖,等待喚醒

System.out.println(sum.total);

System.out.println("thread1 release lock");

}

} catch (Exception e) {

e.printStackTrace();

}

}

}).start();

new Thread(new Runnable() {

@Override

public void run() {

try {

synchronized (sum) {

System.out.println("thread2 get lock");

sum.wait(); //主動釋放sum對象鎖,等待喚醒

System.out.println(sum.total);

System.out.println("thread2 release lock");

}

} catch (Exception e) {

e.printStackTrace();

}

}

}).start();

new Thread(new Runnable() {

@Override

public void run() {

try {

synchronized (sum) {

System.out.println("thread3 get lock");

sum.sum();

sum.notifyAll();//喚醒其他等待線程(線程1,2)

Thread.sleep(2000);

System.out.println("thread3 really release lock");

}

} catch (Exception e) {

e.printStackTrace();

}

}

}).start();

}

}

class Sum{

public Integer total=0;

public void sum() throws Exception{

total=100;

Thread.sleep(5000);

}

}

thread1 get lock

thread2 get lock

thread3 get lock

thread3 really release lock

100

thread2 release lock

100

thread1 release lock

總結

以上是生活随笔為你收集整理的java wait 释放锁_JAVA锁之wait,notify(wait会释放锁,notify仅仅只是通知,不释放锁)...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 青娱乐超碰 | 91美女片黄 | 超碰国产一区二区三区 | 亚洲热在线观看 | 懂色av成人一区二区三区 | 国产在线久久久 | 麻豆国产一区二区三区四区 | 韩国久久久久 | 久久久国产精品黄毛片 | 中国少妇做爰全过程毛片 | 亚洲激情a | 中文字幕免费视频观看 | 91久久久久久久久 | 日韩无马 | 国产一区二区在线精品 | av狠狠干| 少妇又白又嫩又色又粗 | 成年人免费在线 | 国产精品无码av在线播放 | 中文字幕人妻一区二区三区视频 | 亚洲永久无码7777kkk | 夜夜骑夜夜操 | 日本日皮视频 | 亚洲国产精品无码观看久久 | 少妇太紧太爽又黄又硬又爽小说 | 久草免费在线视频观看 | 精品视频免费播放 | 日本黄色不卡视频 | 丰满肉嫩西川结衣av | 强睡邻居人妻中文字幕 | 久久影院一区 | 美日韩精品 | 黄色1级大片| 一区二区三区精品免费视频 | 在线视频网站 | 中文字幕在线日本 | 神马伦理视频 | 使劲插视频 | 韩国伦理在线看 | 极品久久久 | 椎名空在线播放 | 欧美日韩精品三区 | 精品国产乱码久久久久久闺蜜 | 911香蕉视频| 免费观看国产精品视频 | 99热网 | 美女视频黄色在线观看 | 波多野吉衣一区二区三区 | 色综合一区二区三区 | 国产一区麻豆 | 天堂在线资源库 | eeuss一区| 欧美精品极品 | 亚洲久久视频 | av天堂永久资源网 | 丁香激情五月 | 自拍偷拍p| 欧美激情一二三区 | 中文无码一区二区三区在线观看 | 91在线网站 | 国产免费片| 欧美一区二区三区成人 | 成人综合站 | 毛片av网站| 亚州国产精品 | 国产伦精品一区二区三区视频我 | 无码人妻精品一区二区三区99日韩 | 夜夜操夜夜摸 | 国产美女精品人人做人人爽 | 欧美国产精品一区二区 | av中文在线资源 | 夜夜夜网 | 亚洲产国偷v产偷v自拍涩爱 | 欧美91av| 精品女同一区二区 | av不卡在线 | 国产91在线高潮白浆在线观看 | 日本视频免费在线 | 少妇av | 美女国产一区 | 亚洲 欧洲 日韩 | 精品国产av无码 | 蜜桃视频无码区在线观看 | 日韩毛片在线看 | 婷婷伊人五月 | 国产三级做爰高清在线 | 日韩高清精品免费观看 | 精东影业一区二区三区 | 日韩av在线网站 | 午夜成年视频 | 五月激情站 | 蜜桃av色偷偷av老熟女 | 中文国产在线观看 | 麻豆视频网站在线观看 | 国产人妖av | 91丨国产丨捆绑调教 | 精品人妻一区二区三区日产 | 干爹你真棒插曲免费 | 专干老肥女人88av |