亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java中for(;;)和while(true)的區(qū)別

 更新時(shí)間:2021年11月25日 10:50:30   作者:海擁  
這篇文章主要介紹了 Java中for(;;)和while(true)的區(qū)別,文章圍繞for(;;)和while(true)的相關(guān)自來(lái)哦展開(kāi)詳細(xì)內(nèi)容,需要的小伙伴可以參考一下,希望對(duì)大家有所幫助

1、問(wèn)題來(lái)源

在閱讀JavaJDK源碼時(shí),發(fā)現(xiàn)大部分寫(xiě)源碼的大佬多采用for(;;)的方式來(lái)死循環(huán),比如說(shuō)AQS(AbstractQueuedSynchronizer)中大量使用的自旋的方式獲取共享狀態(tài)。

/**

 * 通過(guò)“死循環(huán)”的方式來(lái)正確的添加節(jié)點(diǎn)

 */

private Node enq(final Node node) {

    // 不斷循環(huán),直至CAS插入節(jié)點(diǎn)成功

    for (;;) {

        Node t = tail;

        if (t == null) { 

            // 當(dāng)尾節(jié)點(diǎn)為null,此時(shí)需要初始化頭節(jié)點(diǎn)和尾節(jié)點(diǎn)

            if (compareAndSetHead(new Node()))

                tail = head;

        } else {

            // 插入節(jié)點(diǎn)前驅(qū)節(jié)點(diǎn)指向原先尾節(jié)點(diǎn)

            node.prev = t;

            // CAS插入至同步隊(duì)列的尾節(jié)點(diǎn)

            if (compareAndSetTail(t, node)) {

                t.next = node;

                return t;

            }

        }

    }

}

/**

 * “死循環(huán)”獲取同步狀態(tài),并且當(dāng)前僅當(dāng)前驅(qū)節(jié)點(diǎn)是頭節(jié)點(diǎn)是才能夠嘗試獲取同步狀態(tài)

 */

final boolean acquireQueued(final Node node, int arg) {

    boolean failed = true;

    try {

        boolean interrupted = false;

        // 不斷循環(huán)

        for (;;) {

            // 獲取當(dāng)前節(jié)點(diǎn)的前驅(qū)節(jié)點(diǎn),如果前驅(qū)節(jié)點(diǎn)為null將會(huì)拋出空指針異常

            final Node p = node.predecessor();

            // 如果當(dāng)前節(jié)點(diǎn)的前驅(qū)節(jié)點(diǎn)是頭節(jié)點(diǎn),嘗試獲取同步狀態(tài)

            if (p == head && tryAcquire(arg)) {

                // 設(shè)置當(dāng)前節(jié)點(diǎn)為頭節(jié)點(diǎn),并且將節(jié)點(diǎn)線程和節(jié)點(diǎn)的前驅(qū)節(jié)點(diǎn)置為null,help GC

                setHead(node);

                p.next = null; // help GC

                failed = false;

                return interrupted;

            }

            // 如果不符合條件,則判斷當(dāng)前節(jié)點(diǎn)前驅(qū)節(jié)點(diǎn)的waitStatus狀態(tài)來(lái)決定是否需要掛起LockSupport.park(this);

            if (shouldParkAfterFailedAcquire(p, node) &&

                parkAndCheckInterrupt())

                interrupted = true;

        }

    } finally {

        // 失敗則取消

        if (failed)

            cancelAcquire(node);

    }

}

2、比較

Java代碼在編譯后都會(huì)裝換為虛擬機(jī)可以識(shí)別的字節(jié)碼,我們通過(guò)編譯器對(duì)兩者生成的字節(jié)碼從原理是來(lái)觀察兩者的區(qū)別

2.1 測(cè)試代碼for

package com.liziba.jsw;

/**

 * <p>

 *		for死循環(huán)測(cè)試

 * </p>

 *

 * @Author: Liziba

 * @Date: 2021/6/21 11:36

 */

public class Test {



    private static void m1() {

        for (;;) {



        }

    }

    

}

通過(guò) javap -v Test.class查看生成的字節(jié)碼(只截取關(guān)鍵部分)

2.2 測(cè)試代碼while

package com.liziba.jsw;



/**

 * <p>

 *		while死循環(huán)測(cè)試

 * </p>

 *

 * @Author: Liziba

 * @Date: 2021/6/21 11:36

 */

public class Test {

    

    private static void m2() {

        while (true){



        }

    }

    

}

通過(guò) javap -v Test.class查看生成的字節(jié)碼(只截取關(guān)鍵部分)

3、結(jié)論

for死循環(huán)和while死循環(huán)編譯后的字節(jié)碼(編譯器是可以做優(yōu)化的),完全一模一樣,所以兩者在使用過(guò)程中,其實(shí)是沒(méi)有任何區(qū)別。看到這里是不是有點(diǎn)生氣,但是又想問(wèn)問(wèn)什么源碼那些大佬寫(xiě)代碼基本上不用while(true),我想主要原因還是早期C語(yǔ)言中for(;;)循環(huán)和while(1)編譯生成的字節(jié)碼不一樣,for(;;)生成的字節(jié)碼明顯更加少,一定程度上能節(jié)省一些內(nèi)存空間。所以很多java大佬,也是精通各種其他語(yǔ)言的,因此寫(xiě)法習(xí)慣也就延續(xù)下來(lái)了吧。再者,我在查閱資料的時(shí)候也看到有筆者驗(yàn)證早期的Java編譯器對(duì)for死循環(huán)編譯生成的字節(jié)碼也是少于while死循環(huán)編譯后生成的字節(jié)碼,可能隨著編譯器優(yōu)化能力不斷的增強(qiáng),現(xiàn)在這兩者在目前廣泛使用的編譯器中已經(jīng)沒(méi)有什么區(qū)別了。

到此這篇關(guān)于 Javafor(;;)while(true)的區(qū)別的文章就介紹到這了,更多相關(guān)for(;;)while(true)的區(qū)別內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 如何用Java?幾分鐘處理完?30?億個(gè)數(shù)據(jù)(項(xiàng)目難題)

    如何用Java?幾分鐘處理完?30?億個(gè)數(shù)據(jù)(項(xiàng)目難題)

    現(xiàn)有一個(gè) 10G 文件的數(shù)據(jù),里面包含了 18-70 之間的整數(shù),分別表示 18-70 歲的人群數(shù)量統(tǒng)計(jì),今天小編通過(guò)本文給大家講解如何用Java?幾分鐘處理完?30?億個(gè)數(shù)據(jù),這個(gè)問(wèn)題一直以來(lái)是項(xiàng)目難題,今天通過(guò)本文給大家詳細(xì)介紹下,感興趣的朋友一起看看吧
    2022-07-07
  • java實(shí)現(xiàn)在pdf模板的指定位置插入圖片

    java實(shí)現(xiàn)在pdf模板的指定位置插入圖片

    這篇文章主要為大家詳細(xì)介紹了java如何實(shí)現(xiàn)在pdf模板的指定位置插入圖片,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-10-10
  • 淺談Java自定義注解相關(guān)知識(shí)

    淺談Java自定義注解相關(guān)知識(shí)

    今天帶大家來(lái)學(xué)習(xí)Java注解的相關(guān)知識(shí),文中對(duì)自定義注解作了非常詳細(xì)的介紹,對(duì)正在學(xué)習(xí)Java的小伙伴們很有幫助,需要的朋友可以參考下
    2021-05-05
  • IDEA2023版本創(chuàng)建Spring項(xiàng)目只能勾選17和21卻無(wú)法使用Java8的完美解決方案

    IDEA2023版本創(chuàng)建Spring項(xiàng)目只能勾選17和21卻無(wú)法使用Java8的完美解決方案

    想創(chuàng)建一個(gè)springboot的項(xiàng)目,本地安裝的是1.8,但是在使用Spring Initializr創(chuàng)建項(xiàng)目時(shí),發(fā)現(xiàn)版本只有17和21,這篇文章主要介紹了IDEA2023版本創(chuàng)建Sping項(xiàng)目只能勾選17和21,卻無(wú)法使用Java8的解決方法,需要的朋友可以參考下
    2023-12-12
  • IDEA部署Tomcat的超詳細(xì)圖文教程

    IDEA部署Tomcat的超詳細(xì)圖文教程

    最近迫于無(wú)奈從我哪破舊的Eclipse轉(zhuǎn)換到了IDEA,然后就是超多的不習(xí)慣,下面這篇文章主要給大家介紹了關(guān)于IDEA部署Tomcat的相關(guān)資料,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2023-02-02
  • Windows7下的Java運(yùn)行環(huán)境搭建過(guò)程圖解

    Windows7下的Java運(yùn)行環(huán)境搭建過(guò)程圖解

    這篇文章主要介紹了Windows7下的Java運(yùn)行環(huán)境搭建過(guò)程圖解,需要的朋友可以參考下
    2014-04-04
  • Java @Value(

    Java @Value("${xxx}")取properties時(shí)中文亂碼的解決

    這篇文章主要介紹了Java @Value("${xxx}")取properties時(shí)中文亂碼的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Mybatis 中的一對(duì)一,一對(duì)多,多對(duì)多的配置原則示例代碼

    Mybatis 中的一對(duì)一,一對(duì)多,多對(duì)多的配置原則示例代碼

    這篇文章主要介紹了 Mybatis 中的一對(duì)一,一對(duì)多,多對(duì)多的配置原則示例代碼,需要的朋友可以參考下
    2017-03-03
  • iReport簡(jiǎn)單使用方法圖文教程

    iReport簡(jiǎn)單使用方法圖文教程

    iReport是一個(gè)能夠創(chuàng)建復(fù)雜報(bào)表的開(kāi)源項(xiàng)目,它100%使用Java語(yǔ)言編寫(xiě),是目前全球最為流行的開(kāi)源報(bào)表設(shè)計(jì)器,由于它豐富的圖形界面,你能夠很快的創(chuàng)建出任何一種你想要的報(bào)表
    2021-10-10
  • Spring Boot ActiveMQ連接池配置過(guò)程解析

    Spring Boot ActiveMQ連接池配置過(guò)程解析

    這篇文章主要介紹了Spring Boot ActiveMQ連接池配置過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07

最新評(píng)論