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

面試突擊:Notify是隨機喚醒嗎?

開發 后端
notify 喚醒線程的規則是隨機喚醒還是順序喚醒取決于 JVM 的具體實現,作為主流的 HotSpot 虛擬機中的 notify 的喚醒規則是順序的,也就是 notify 會按照線程的休眠順序,依次喚醒線程。

作者 | 磊哥

來源 | Java面試真題解析(ID:aimianshi666)

轉載請聯系授權(微信ID:GG_Stone)

做 Java 開發的小伙伴,對 wait 方法和 notify 方法應該都比較熟悉,這兩個方法在線程通訊中使用的頻率非常高,但對于 notify 方法的喚醒順序,有很多小伙伴的理解都是錯誤的,有很多人會認為 notify 是隨機喚醒的,但它真的是隨機喚醒的嗎?

帶著這個疑問,我們嘗試休眠 100 個線程,再喚醒 100 個線程,并把線程休眠和喚醒的順序保持到兩個集合中,最后再打印一下這兩個集合,看一下它們的執行順序,如果它們的順序是一致的,那說明 notify 是順序喚醒的,否則則是隨機喚醒的,notify 測試代碼如下:

import java.util.ArrayList;
import java.util.List;
public class NotifyExample {
// 保存休眠線程的順序
private static List<String> waitList = new ArrayList<>();
// 保存喚醒線程的順序
private static List<String> notifyList = new ArrayList<>();
public static void main(String[] args) throws InterruptedException {
final Object lock = new Object();
// 休眠 100 個線程
for (int i = 0; i < 100; i++) {
String threadName = Integer.toString(i); // 定義線程名
new Thread(() -> {
// 獲取當前執行線程的線程名
String currThreadName = Thread.currentThread().getName();
synchronized (lock) {
waitList.add(currThreadName); // 存入等待 list
try {
lock.wait(); // 休眠線程
} catch (InterruptedException e) {
e.printStackTrace();
}
notifyList.add(currThreadName); // 存儲喚醒 list
}
}, threadName).start();
}
Thread.sleep(1000);
// 喚醒 100 個線程
for (int i = 0; i < 100; i++) {
synchronized (lock) {
lock.notify(); // 喚醒線程
}
}
// 打印 2 個線程列表
System.out.println("等待線程順序:" + waitList);
System.out.println("喚醒線程順序:" + waitList);
}
}

以上程序的執行結果如下圖所示: 從上述打印的結果我們可以看出,使用 notify 并不是隨機喚醒的,而是順序喚醒的,雖然以上代碼能證明這個結論,但為了更清楚的解釋這個問題,我們查看了 notify 的實現源碼,它的源碼內容如下: 簡單翻譯一下上面的重點內容,notify 選擇喚醒的線程是任意的,但具體的實現還要依賴于 JVM。也就是說 notify 的喚醒規則,最終取決于 JVM 廠商,不同的廠商的實現可能是不同的,比如阿里的 JVM 和 Oracle 的 JVM,關于 notify 的喚醒規則可能是不一樣的。

那作為一個普通的程序員我們要研究的就是官方的 JVM 也就是 HotSpot 虛擬機,它的 notify 實現源碼在 ObjectMonitor.cpp 中,具體源碼如下:

DequeueWaiter 方法實現的源碼如下:

從上述源碼可以看出,在進行喚醒時,每次會從 _WaitSet 等待集合中獲取第一個元素進行出隊操作,這也說明了 notify 是順序喚醒的。

總結

notify 喚醒線程的規則是隨機喚醒還是順序喚醒取決于 JVM 的具體實現,作為主流的 HotSpot 虛擬機中的 notify 的喚醒規則是順序的,也就是 notify 會按照線程的休眠順序,依次喚醒線程。

責任編輯:姜華 來源: Java面試真題解析
相關推薦

2022-07-11 07:10:48

HTTP協議類型

2022-07-27 07:36:01

TCP可靠性

2022-04-13 14:43:05

JVM同步鎖Monitor 監視

2022-01-24 07:01:20

安全多線程版本

2022-09-07 07:05:25

跨域問題安全架構

2022-08-01 07:07:15

粘包半包封裝

2022-05-30 07:34:33

三范式Java

2010-03-18 10:25:30

Java notify

2022-04-06 07:50:28

線程安全代碼

2022-08-31 07:04:50

Bean作用域

2022-02-28 07:01:22

線程中斷interrupt

2022-04-11 07:40:45

synchroniz靜態方法程序

2022-03-14 07:32:06

線程池拒絕策略自定義

2022-03-02 07:36:37

池化技術Java線程池

2022-03-23 08:51:21

線程池Java面試題

2022-07-06 07:35:19

group byMySQL

2022-05-05 07:38:32

volatilJava并發

2022-06-06 07:35:26

MySQLInnoDBMyISAM

2022-06-22 07:34:05

自增列MySQL

2022-03-16 07:33:40

守護線程用戶線程語言
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 91精品国产一区二区三区 | 在线观看视频福利 | 国产一区二区在线免费观看 | 四虎影视免费在线 | 国产99久久久国产精品下药 | 九九热国产视频 | 国产精品伦理一区二区三区 | 91国内视频在线 | 久久一区二区免费视频 | 国产亚洲欧美在线 | 久久国产综合 | 国产日韩精品在线 | 欧美极品视频在线观看 | 日韩欧美精品一区 | 黄色小视频入口 | 亚洲欧美国产精品一区二区 | 九九热这里只有精品在线观看 | 久久久久久亚洲精品 | 三a毛片 | 91pron在线| 日韩欧美国产电影 | 爱草视频 | 91久久精品一区二区二区 | 日韩欧美一区二区三区免费观看 | 中文字幕免费观看 | 欧美男人天堂 | 久久精品小视频 | 精品欧美黑人一区二区三区 | 欧美在线小视频 | 99精品国自产在线 | 成人av一区二区亚洲精 | 日韩一二三区 | 人人人干 | 久久99精品国产 | 国产日韩欧美在线播放 | 成人免费视频网 | 午夜视频一区 | 欧美精品一区二区三区在线播放 | 欧美精品一区二区在线观看 | 在线91| 亚洲精品一区久久久久久 |