成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

漫畫:怎么證明Sleep不釋放鎖,而Wait釋放鎖?

開發(fā) 前端
本文我們通過 synchronized? 鎖定同一對象,來測試 wait? 和 sleep? 方法,再通過執(zhí)行結(jié)果的先后順序證明:wait? 方法會釋放鎖,而 sleep? 方法并不會。同時我們還講了幾個 wait? 和 sleep 的常見面試問題,希望本文可以幫助到你。

圖片

圖片

圖片

圖片

圖片

圖片

圖片

wait 加鎖示例

public class WaitDemo {
private static Object locker = new Object();

public static void main(String[] args) throws InterruptedException {
WaitDemo waitDemo = new WaitDemo();

// 啟動新線程,防止主線程被休眠
new Thread(() -> {
try {
waitDemo.doWait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
Thread.sleep(200); // 此行本身沒有意義,是為了確保 wait() 先執(zhí)行再執(zhí)行 notify()
waitDemo.doNotify();
}

/**
* 執(zhí)行 wait()
*/
private void doWait() throws InterruptedException {
synchronized (locker) {
System.out.println("wait start.");
locker.wait();
System.out.println("wait end.");
}
}

/**
* 執(zhí)行 notify()
*/
private void doNotify() {
synchronized (locker) {
System.out.println("notify start.");
locker.notify();
System.out.println("notify end.");
}
}
}

以上程序的執(zhí)行結(jié)果為:

  • wait start.
  • notify start.
  • notify end.
  • wait end.

代碼解析

從上述代碼可以看出,我們給 wait() 和 notify() 兩個方法上了同一把鎖(locker),但在調(diào)用完 wait() 方法之后 locker 鎖就被釋放了,所以程序才能正常執(zhí)行 notify() 的代碼,因?yàn)槭峭话焰i,如果不釋放鎖的話,是不會執(zhí)行 notify() 的代碼的,這一點(diǎn)也可以從打印的結(jié)果中證實(shí)(結(jié)果輸出順序),所以綜合以上情況來說 wait() 方法是釋放鎖的。

sleep 加鎖示例

public class WaitDemo {
private static Object locker = new Object();

public static void main(String[] args) throws InterruptedException {
WaitDemo waitDemo = new WaitDemo();
// 啟動新線程,防止主線程被休眠
new Thread(() -> {
synchronized (locker) {
try {
System.out.println("sleep start.");
Thread.sleep(1000);
System.out.println("sleep end.");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();

Thread.sleep(200);
waitDemo.doNotify();
}

/**
* 執(zhí)行 notify()
*/
private void doNotify() {
synchronized (locker) {
System.out.println("notify start.");
locker.notify();
System.out.println("notify end.");
}
}
}

以上程序的執(zhí)行結(jié)果為:

  • sleep start.
  • sleep end.
  • notify start.
  • notify end.

代碼解析

從上述代碼可以看出 sleep(1000) 方法(行號:11)執(zhí)行之后,調(diào)用 notify() 方法并沒有獲取到 locker 鎖,從上述執(zhí)行結(jié)果中可以看出,而是執(zhí)行完 sleep(1000) 方法之后才執(zhí)行的 notify() 方法,因此可以證明調(diào)用 sleep() 方法并不會釋放鎖。

知識擴(kuò)展

1.sleep 和 wait 有什么區(qū)別?

sleep 和 wait 幾乎是所有面試中必問的題,但想完全回答正確似乎沒那么簡單。

對于 sleep 和 wait 的區(qū)別,通常的回答是這樣的:

wait 必須搭配 synchronize 一起使用,而 sleep 不需要;

進(jìn)入 wait 狀態(tài)的線程能夠被 notify 和 notifyAll 線程喚醒,而 sleep 狀態(tài)的線程不能被 notify 方法喚醒;

wait 通常有條件地執(zhí)行,線程會一直處于 wait 狀態(tài),直到某個條件變?yōu)檎妫?sleep 僅僅讓你的線程進(jìn)入睡眠狀態(tài);

wait 方法會釋放對象鎖,但 sleep 方法不會。

但上面的回答顯然遺漏了一個重要的區(qū)別,在調(diào)用 wait 方法之后,線程會變?yōu)?nbsp;WATING 狀態(tài),而調(diào)用 sleep 方法之后,線程會變?yōu)?nbsp;TIMED_WAITING 狀態(tài)。

2.wait 能不能在 static 方法中使用?為什么?

不能,因?yàn)?nbsp;wait 方法是實(shí)例方法(非 static 方法),因此不能在 static 中使用,源碼如下:

public final void wait() throws InterruptedException {
wait(0);
}

3.wait/notify 可以不搭配 synchronized 使用嗎?為什么?

不行,因?yàn)椴淮钆?nbsp;synchronized 使用的話程序會報錯,如下圖所示:

圖片

更深層次的原因是因?yàn)椴患?nbsp;synchronized 的話會造成 Lost Wake-Up Problem,喚醒丟失的問題,詳情可見:https://juejin.im/post/5e6a4d8a6fb9a07cd80f36d1

總結(jié)

本文我們通過 synchronized 鎖定同一對象,來測試 wait 和 sleep 方法,再通過執(zhí)行結(jié)果的先后順序證明:wait 方法會釋放鎖,而 sleep 方法并不會。同時我們還講了幾個 wait 和 sleep 的常見面試問題,希望本文可以幫助到你。

責(zé)任編輯:武曉燕 來源: Java中文社群
相關(guān)推薦

2020-07-22 08:06:46

釋放鎖synchronize線程

2021-10-01 00:12:12

Redis分布式

2024-03-13 13:25:09

Redis分布式鎖

2021-07-02 08:51:09

Redisson分布式鎖公平鎖

2021-07-03 17:45:57

分布式Redisson MultiLock

2021-07-09 06:48:31

ZooKeeperCurator源碼

2024-08-07 14:58:00

MySQL釋放鎖核心模塊

2021-07-13 10:00:01

ThreadJoin方法

2014-08-14 10:38:30

SQL Server查詢

2024-10-15 09:27:36

2018-10-16 08:40:56

Linux鎖住鍵盤桌面應(yīng)用

2023-09-22 08:39:00

sleep函數(shù)語言

2024-09-03 08:06:30

AQS線程代碼

2024-03-07 07:37:03

AQS線程獨(dú)占鎖

2011-05-26 15:52:31

sleep()wait()

2023-10-26 16:02:04

線程

2019-11-28 16:00:06

重入鎖讀寫鎖樂觀鎖

2019-01-04 11:18:35

獨(dú)享鎖共享鎖非公平鎖

2019-10-08 14:40:53

Java線程

2011-08-24 16:41:38

LOCK中文man
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 久久99国产精一区二区三区 | 亚洲综合婷婷 | 久久国产精品偷 | 91久久久久久 | 亚洲欧美日韩中文在线 | 99久久久久久99国产精品免 | www.伊人.com| 男人天堂网址 | 中文字幕乱码视频32 | 国产精品1区2区3区 欧美 中文字幕 | www.日本国产 | 国产成年人小视频 | a久久 | 亚洲成人免费在线观看 | 精品国产一区二区三区久久久久久 | 免费观看成人av | 91毛片在线观看 | 黄频视频 | 亚洲一区二区久久 | 午夜影院视频在线观看 | av片在线观看 | 深夜爽视频 | 国产精品久久久久久久免费大片 | 欧美性吧| 不卡一二三区 | 女生羞羞视频 | 欧美一级大片 | 国产成人综合在线 | 天堂一区在线 | 欧美天堂 | 91精品国产乱码麻豆白嫩 | 99精品国产一区二区青青牛奶 | 国产一区 在线视频 | 日韩高清一区二区 | 一区二区精品在线 | 麻豆成人在线视频 | 国产一区二区a | 国产一区二区a | av在线伊人 | 午夜精品久久久久久久久久久久久 | 一区二区成人 |