欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java中notify是順序喚醒還是隨機喚醒的

 更新時間:2022年05月08日 14:36:15   作者:??Java中文社群????  
這篇文章主要介紹了Java中notify是順序喚醒還是隨機喚醒的,有很多人會認為?notify?是隨機喚醒的,但它真的是隨機喚醒的嗎?帶著疑問一起進入文章了解具體的內容吧

前言:

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

帶著這個疑問,我們嘗試休眠 100 個線程,再喚醒 100 個線程,并把線程休眠和喚醒的順序保持到兩個集合中,最后再打印一下這兩個集合,看一下它們的執(zhí)行順序,如果它們的順序是一致的,那說明 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(() -> {
                // 獲取當前執(zhí)行線程的線程名
                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);
    }
}

以上程序的執(zhí)行結果如下圖所示: 

 從上述打印的結果我們可以看出,使用 notify 并不是隨機喚醒的,而是順序喚醒的,雖然以上代碼能證明這個結論,但為了更清楚的解釋這個問題,我們查看了 notify 的實現源碼,

它的源碼內容如下:

 簡單翻譯一下上面的重點內容,notify 選擇喚醒的線程是任意的,但具體的實現還要依賴于 JVM。也就是說 notify 的喚醒規(guī)則,最終取決于 JVM 廠商,不同的廠商的實現可能是不同的,比如阿里的 JVM 和 Oracle 的 JVM,關于 notify 的喚醒規(guī)則可能是不一樣的。

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

具體源碼如下: 

 DequeueWaiter 方法實現的源碼如下: 

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

總結:

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

到此這篇關于Java中notify是順序喚醒還是隨機喚醒的的文章就介紹到這了,更多相關Java notify喚醒規(guī)則內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • SpringBoot學習之全局異常處理設置(返回JSON)

    SpringBoot學習之全局異常處理設置(返回JSON)

    本篇文章主要介紹了SpringBoot學習之全局異常處理設置(返回JSON),小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-02-02
  • 你不知道的 IDEA Debug調試小技巧(小結)

    你不知道的 IDEA Debug調試小技巧(小結)

    這篇文章主要介紹了你不知道的 IDEA Debug調試小技巧(小結),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-10-10
  • springboot整合flowable框架入門步驟

    springboot整合flowable框架入門步驟

    最近工作中有用到工作流的開發(fā),引入了flowable工作流框架,在此記錄一下springboot整合flowable工作流框架的過程,感興趣的朋友一起看看吧
    2022-04-04
  • 解決SpringBoot啟動過后不能訪問jsp頁面的問題(超詳細)

    解決SpringBoot啟動過后不能訪問jsp頁面的問題(超詳細)

    這篇文章主要介紹了解決SpringBoot啟動過后不能訪問jsp頁面的問題,文中通過示例代碼介紹的非常詳細,有需要的朋友可以參考一下,希望對你有所幫助。
    2020-05-05
  • jstl之map,list訪問遍歷以及el表達式map取值的實現

    jstl之map,list訪問遍歷以及el表達式map取值的實現

    下面小編就為大家?guī)硪黄猨stl之map,list訪問遍歷以及el表達式map取值的實現。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-03-03
  • Springboot整合FreeMarker的實現示例

    Springboot整合FreeMarker的實現示例

    本文主要介紹了Springboot整合FreeMarker的實現示例,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • 詳解spring集成mina實現服務端主動推送(包含心跳檢測)

    詳解spring集成mina實現服務端主動推送(包含心跳檢測)

    本篇文章主要介紹了詳解spring集成mina實現服務端主動推送(包含心跳檢測),具有一定的參考價值,與興趣的可以了解一下
    2017-09-09
  • 解析springboot整合谷歌開源緩存框架Guava Cache原理

    解析springboot整合谷歌開源緩存框架Guava Cache原理

    本文主要為大家解析了springboot整合谷歌開源緩存框架Guava Cache的原理以及在實際開發(fā)過程中的使用,附含源碼,有需要的朋友可以參考下
    2021-08-08
  • java中List數組用逗號分隔開轉成字符串2種方法

    java中List數組用逗號分隔開轉成字符串2種方法

    在我們日常開發(fā)中,在前后端交互的時候會遇到多個id或其他字段存放到一個字段中,這時我們會遇到一個List(集合)---->String(單個字段),這篇文章主要給大家介紹了關于java中List數組用逗號分隔開轉成字符串的2種方法,需要的朋友可以參考下
    2023-10-10
  • Spring?Boot?整合持久層之Spring Data JPA

    Spring?Boot?整合持久層之Spring Data JPA

    在介紹Spring Data JPA的時候,我們首先認識下Hibernate。Hibernate是數據訪問解決技術的絕對霸主,使用O/R映射技術實現數據訪問,O/R映射即將領域模型類和數據庫的表進行映射,通過程序操作對象而實現表數據操作的能力,讓數據訪問操作無須關注數據庫相關的技術
    2022-08-08

最新評論