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

深入理解Thread.sleep(0)的作用

 更新時(shí)間:2025年09月16日 10:58:17   作者:在下uptown  
本文主要介紹了深入理解Thread.sleep(0)的作用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

Thread.sleep

先回顧一下Thread.sleep(n)方法的用法,sleep只是去休眠n毫秒的時(shí)間,當(dāng)前對(duì)象并沒(méi)有釋放掉鎖,與Object.wait()方法最大的區(qū)別就在這,wait方法會(huì)釋放掉鎖,而sleep不會(huì)。

如此看來(lái)sleep(n)中的n是休眠n毫秒,那么n=0的時(shí)候理論上說(shuō)毫無(wú)意義,但有時(shí)候閱讀源碼的時(shí)候又能看到這句。寫(xiě)中間件的大佬豈能犯這種錯(cuò)誤。且聽(tīng)我細(xì)細(xì)道來(lái)

垃圾回收

還是要從垃圾回收說(shuō)起,剛開(kāi)始背垃圾回收八股文的時(shí)候根本都沒(méi)想過(guò)JVM在什么時(shí)候回收辣雞,直到練習(xí)時(shí)長(zhǎng)兩年班之后,在某個(gè)公眾號(hào)推文上才知道,JVM有一個(gè)安全區(qū)域和安全點(diǎn) safepoint的概念。

其實(shí)不難理解,程序跑著跑著代碼里一個(gè)虛引用還沒(méi)來(lái)及用呢,JVM突然回收直接給干沒(méi)了,那肯定會(huì)出大問(wèn)題。所以說(shuō)要有一個(gè)合適的時(shí)機(jī)去做gc。

程序執(zhí)行時(shí)并非在所有地方都能停頓下來(lái)開(kāi)始GC,只有在特定的位置才能停頓下來(lái)開(kāi)始GC,這些位置稱(chēng)為"安全點(diǎn)(Safepoint)"

如何在GC發(fā)生時(shí),檢查所有線(xiàn)程都跑到最近的安全點(diǎn)停頓下來(lái)呢?

  1. 搶先式中斷:(目前沒(méi)有虛擬機(jī)采用了) 首先中斷所有線(xiàn)程。如果還有線(xiàn)程不在安全點(diǎn),就恢復(fù)線(xiàn)程,讓線(xiàn)程跑到安全點(diǎn)。
  2. 主動(dòng)式中斷: 設(shè)置一個(gè)中斷標(biāo)志,各個(gè)線(xiàn)程運(yùn)行到SafePoint的時(shí)候主動(dòng)輪詢(xún)這個(gè)標(biāo)志,如果中斷標(biāo)志為真,則將自己進(jìn)行中斷掛起。

安全區(qū)域是指一段代碼片中,引用關(guān)系不會(huì)發(fā)生變化,在這個(gè)區(qū)域任何地方GC都是安全的,安全區(qū)域可以看做是安全點(diǎn)的一個(gè)擴(kuò)展。線(xiàn)程執(zhí)行到安全區(qū)域的代碼時(shí),首先標(biāo)識(shí)自己進(jìn)入了安全區(qū)域,這樣GC時(shí)就不用管進(jìn)入安全區(qū)域的線(xiàn)程了,線(xiàn)層要離開(kāi)安全區(qū)域時(shí)就檢查JVM是否完成了GC Roots枚舉,如果完成就繼續(xù)執(zhí)行,如果沒(méi)有完成就等待直到收到可以安全離開(kāi)的信號(hào)

安全點(diǎn)完美的解決了如何進(jìn)入GC問(wèn)題,實(shí)際情況可能比這個(gè)更復(fù)雜,但是如果程序長(zhǎng)時(shí)間不執(zhí)行,比如線(xiàn)程調(diào)用的sleep方法,這時(shí)候程序無(wú)法響應(yīng)JVM中斷請(qǐng)求這時(shí)候線(xiàn)程無(wú)法到達(dá)安全點(diǎn),顯然JVM也不可能等待程序喚醒,這時(shí)候就需要安全區(qū)域了。

sleep(0)

理解了程序垃圾回收的時(shí)機(jī)再回過(guò)頭來(lái)就不難理解sleep(0)的作用了,除了主動(dòng)放棄調(diào)度之外,可以簡(jiǎn)單的理解為程序不是任意時(shí)刻都能gc,需要程序跑到safepoint點(diǎn),而native方法執(zhí)行以后就會(huì)插入一個(gè)safepoint,此時(shí)線(xiàn)程在執(zhí)行JVM以外的代碼不能對(duì)JVM的執(zhí)行狀態(tài)做修改,所以JVM進(jìn)入safepoint可以忽略此線(xiàn)程。

也就是說(shuō)sleep(0)的作用:

  1. 是主動(dòng)讓出cpu調(diào)度提升系統(tǒng)調(diào)度性能
  2. 是使系統(tǒng)進(jìn)入safepoint標(biāo)記gc。

使用場(chǎng)景:

Thread.sleep(0) 的使用場(chǎng)景非常有限,通常只在以下情況下考慮:

  • 測(cè)試或調(diào)試: 在多線(xiàn)程測(cè)試或調(diào)試中,可以使用 Thread.sleep(0) 來(lái)強(qiáng)制觸發(fā)線(xiàn)程切換,以便觀察不同線(xiàn)程的執(zhí)行順序或行為。
  • 某些底層優(yōu)化: 在極少數(shù)情況下,某些底層代碼可能會(huì)使用 Thread.sleep(0) 來(lái)嘗試優(yōu)化線(xiàn)程調(diào)度,例如,避免某個(gè)線(xiàn)程長(zhǎng)時(shí)間占用 CPU 而導(dǎo)致其他線(xiàn)程饑餓。
  • 實(shí)時(shí)系統(tǒng)(罕見(jiàn)): 在某些對(duì)實(shí)時(shí)性要求非常高的系統(tǒng)中,可能會(huì)使用 Thread.sleep(0) 來(lái)嘗試更精細(xì)地控制線(xiàn)程調(diào)度。

代碼示例:

public class ThreadSleepZeroExample {
    public static void main(String[] args) {
        Thread thread1 = new Thread(() -> {
            for (int i = 0; i < 5; i++) {
                System.out.println("Thread 1: " + i);
                if (i == 2) {
                    Thread.sleep(0); // 觸發(fā)線(xiàn)程調(diào)度
                }
            }
        });

        Thread thread2 = new Thread(() -> {
            for (int i = 0; i < 5; i++) {
                System.out.println("Thread 2: " + i);
            }
        });

        thread1.start();
        thread2.start();
    }
}

與 Thread.yield() 的區(qū)別:

實(shí)現(xiàn)方式:
Thread.yield() 是一個(gè) Java API 調(diào)用,它的具體實(shí)現(xiàn)依賴(lài)于 JVM 和底層操作系統(tǒng)。
Thread.sleep(0) 在大多數(shù)操作系統(tǒng)上會(huì)被實(shí)現(xiàn)為一個(gè)非常短時(shí)間的睡眠(例如,1 毫秒或更短),或者直接觸發(fā)一次線(xiàn)程上下文切換。
行為:
Thread.yield() 僅僅是給調(diào)度器一個(gè)提示,表示當(dāng)前線(xiàn)程愿意讓出 CPU。調(diào)度器可以忽略這個(gè)提示,繼續(xù)讓當(dāng)前線(xiàn)程執(zhí)行。
Thread.sleep(0) 由于涉及到了系統(tǒng)調(diào)用,它更可能導(dǎo)致實(shí)際的線(xiàn)程切換,因?yàn)樗蟛僮飨到y(tǒng)進(jìn)行處理(即使時(shí)間很短)。雖然在實(shí)際上還是取決于操作系統(tǒng)的實(shí)現(xiàn),不能百分百保證,但是會(huì)讓步CPU的概率更大。

到此這篇關(guān)于深入理解Thread.sleep(0)的作用的文章就介紹到這了,更多相關(guān)Thread.sleep(0)作用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家! 

相關(guān)文章

  • 基于@Valid和@Validated驗(yàn)證List集合的踩坑記錄

    基于@Valid和@Validated驗(yàn)證List集合的踩坑記錄

    這篇文章主要介紹了基于@Valid和@Validated驗(yàn)證List集合的踩坑記錄,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • RocketMQ?Namesrv架構(gòu)工作原理詳解

    RocketMQ?Namesrv架構(gòu)工作原理詳解

    這篇文章主要為大家介紹了RocketMQ?Namesrv架構(gòu)工作原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • Shiro+Cas微服務(wù)化及前后端完全分離

    Shiro+Cas微服務(wù)化及前后端完全分離

    這篇文章主要為大家詳細(xì)介紹了Shiro+Cas微服務(wù)化及前后端完全分離,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • Spring Boot中的那些條件判斷的實(shí)現(xiàn)方法

    Spring Boot中的那些條件判斷的實(shí)現(xiàn)方法

    這篇文章主要介紹了Spring Boot中的那些條件判斷的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • springboot掃碼登錄的簡(jiǎn)單實(shí)現(xiàn)

    springboot掃碼登錄的簡(jiǎn)單實(shí)現(xiàn)

    本文主要介紹基于SpringBoot + Vue + Android實(shí)現(xiàn)的掃碼登錄,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • SpringBoot中的@FeignClient注解使用

    SpringBoot中的@FeignClient注解使用

    文章主要介紹了SpringCloud中的@FeignClient注解的使用及其參數(shù)詳解,包括value/name、url、path、configuration、fallback/fallbackFactory、contextId等,通過(guò)@FeignClient注解,可以方便地聲明一個(gè)REST客戶(hù)端,并定義與目標(biāo)服務(wù)通信的接口
    2024-11-11
  • SpringBoot多數(shù)據(jù)源配置詳細(xì)教程(JdbcTemplate、mybatis)

    SpringBoot多數(shù)據(jù)源配置詳細(xì)教程(JdbcTemplate、mybatis)

    這篇文章主要介紹了SpringBoot多數(shù)據(jù)源配置詳細(xì)教程(JdbcTemplate、mybatis),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • 使用springboot時(shí),解決@Scheduled定時(shí)器遇到的問(wèn)題

    使用springboot時(shí),解決@Scheduled定時(shí)器遇到的問(wèn)題

    這篇文章主要介紹了使用springboot時(shí),解決@Scheduled定時(shí)器遇到的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • mybatis resultType自帶數(shù)據(jù)類(lèi)型別名解讀

    mybatis resultType自帶數(shù)據(jù)類(lèi)型別名解讀

    MyBatis為了簡(jiǎn)化開(kāi)發(fā),通過(guò)org.apache.ibatis.type.TypeAliasRegistry為常見(jiàn)類(lèi)定義了別名,這些別名包括基本數(shù)據(jù)類(lèi)型及其數(shù)組、集合類(lèi)型等,如string對(duì)應(yīng)java.lang.String,int對(duì)應(yīng)java.lang.Integer等,此外,還有特殊前綴的別名如_int對(duì)應(yīng)int類(lèi)型
    2024-10-10
  • java字符串格式化(String類(lèi)format方法)

    java字符串格式化(String類(lèi)format方法)

    這篇文章主要介紹了java字符串格式化(String類(lèi)format方法),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02

最新評(píng)論