最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

1、問題來源

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

/**

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

 */

private Node enq(final Node node) {

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

    for (;;) {

        Node t = tail;

        if (t == null) { 

            // 當尾節(jié)點為null,此時需要初始化頭節(jié)點和尾節(jié)點

            if (compareAndSetHead(new Node()))

                tail = head;

        } else {

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

            node.prev = t;

            // CAS插入至同步隊列的尾節(jié)點

            if (compareAndSetTail(t, node)) {

                t.next = node;

                return t;

            }

        }

    }

}

/**

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

 */

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

    boolean failed = true;

    try {

        boolean interrupted = false;

        // 不斷循環(huán)

        for (;;) {

            // 獲取當前節(jié)點的前驅(qū)節(jié)點,如果前驅(qū)節(jié)點為null將會拋出空指針異常

            final Node p = node.predecessor();

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

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

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

                setHead(node);

                p.next = null; // help GC

                failed = false;

                return interrupted;

            }

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

            if (shouldParkAfterFailedAcquire(p, node) &&

                parkAndCheckInterrupt())

                interrupted = true;

        }

    } finally {

        // 失敗則取消

        if (failed)

            cancelAcquire(node);

    }

}

2、比較

Java代碼在編譯后都會裝換為虛擬機可以識別的字節(jié)碼,我們通過編譯器對兩者生成的字節(jié)碼從原理是來觀察兩者的區(qū)別

2.1 測試代碼for

package com.liziba.jsw;

/**

 * <p>

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

 * </p>

 *

 * @Author: Liziba

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

 */

public class Test {



    private static void m1() {

        for (;;) {



        }

    }

    

}

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

2.2 測試代碼while

package com.liziba.jsw;



/**

 * <p>

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

 * </p>

 *

 * @Author: Liziba

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

 */

public class Test {

    

    private static void m2() {

        while (true){



        }

    }

    

}

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

3、結(jié)論

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

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

相關(guān)文章

  • Java reservedcodecachesize虛擬機參數(shù)案例詳解

    Java reservedcodecachesize虛擬機參數(shù)案例詳解

    這篇文章主要介紹了Java reservedcodecachesize虛擬機參數(shù)案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • 使用SpringBoot整合ssm項目的實例詳解

    使用SpringBoot整合ssm項目的實例詳解

    Spring Boot 現(xiàn)在已經(jīng)成為 Java 開發(fā)領(lǐng)域的一顆璀璨明珠,它本身是包容萬象的,可以跟各種技術(shù)集成。這篇文章主要介紹了使用SpringBoot整合ssm項目,需要的朋友可以參考下
    2018-11-11
  • maven私服的配置使用方法

    maven私服的配置使用方法

    這篇文章主要介紹了maven私服的配置使用方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-08-08
  • Java利用棧實現(xiàn)簡易計算器功能

    Java利用棧實現(xiàn)簡易計算器功能

    這篇文章主要為大家詳細介紹了Java利用棧實現(xiàn)簡易計算器功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • JVM對象創(chuàng)建和內(nèi)存分配原理解析

    JVM對象創(chuàng)建和內(nèi)存分配原理解析

    這篇文章主要介紹了JVM對象創(chuàng)建和內(nèi)存分配原理解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-02-02
  • Rabbit消息重試機制問題記錄

    Rabbit消息重試機制問題記錄

    消息重試機制就是在消息處理失敗之后重新發(fā)送,主要時為了解決消息發(fā)送過程可能會出現(xiàn)的問題,例如 網(wǎng)絡(luò)故障、服務(wù)臨時不可用 等,這篇文章主要介紹了Rabbit消息重試機制問題記錄,需要的朋友可以參考下
    2024-08-08
  • Java 網(wǎng)絡(luò)編程總結(jié)

    Java 網(wǎng)絡(luò)編程總結(jié)

    這篇文章主要給大家分享Java 網(wǎng)絡(luò)編程的一個總結(jié),說到網(wǎng)絡(luò)編程肯定都會想到IP地址、端口、通信協(xié)議等一些必不可少的元素,下面來看看文章的詳細介紹吧
    2021-11-11
  • SpringCloud實戰(zhàn)小貼士之Zuul的路徑匹配

    SpringCloud實戰(zhàn)小貼士之Zuul的路徑匹配

    這篇文章主要介紹了SpringCloud實戰(zhàn)小貼士之Zuul的路徑匹配,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10
  • Java 中的HashMap詳解和使用示例_動力節(jié)點Java學院整理

    Java 中的HashMap詳解和使用示例_動力節(jié)點Java學院整理

    這篇文章主要介紹了Java 中的HashMap詳解和使用示例_動力節(jié)點Java學院整理,需要的朋友可以參考下
    2017-05-05
  • idea 修改項目名和module名稱的操作

    idea 修改項目名和module名稱的操作

    這篇文章主要介紹了idea 修改項目名和module名稱的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02

最新評論

伽师县| 和静县| 岳池县| 富顺县| 惠来县| 海口市| 来宾市| 从化市| 县级市| 阳高县| 全州县| 平塘县| 大方县| 滦平县| 白沙| 普格县| 台安县| 广丰县| 肇州县| 永善县| 方正县| 微山县| 贡觉县| 绥江县| 元阳县| 昌宁县| 江川县| 塔河县| 宿迁市| 十堰市| 贵阳市| 三台县| 崇义县| 紫云| 枣强县| 泰顺县| 德清县| 手机| 大悟县| 庄河市| 宣恩县|