广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Java中for(;;)和while(true)的区别
  • 856
分享到

Java中for(;;)和while(true)的区别

2024-04-02 19:04:59 856人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

目录1、问题来源2、比较2.1 测试代码for2.2 测试代码while3、结论 1、问题来源 在阅读Java的jdk源码时,发现大部分写源码的大佬多采用for(;;)的方式来死循环

1、问题来源

在阅读Javajdk源码时,发现大部分写源码的大佬多采用for(;;)的方式来死循环,比如说AQS(AbstractQueuedSynchronizer)中大量使用的自旋的方式获取共享状态。




private node enq(final Node node) {

    // 不断循环,直至CAS插入节点成功

    for (;;) {

        Node t = tail;

        if (t == null) { 

            // 当尾节点为null,此时需要初始化头节点和尾节点

            if (compareAndSetHead(new Node()))

                tail = head;

        } else {

            // 插入节点前驱节点指向原先尾节点

            node.prev = t;

            // CAS插入至同步队列的尾节点

            if (compareAndSetTail(t, node)) {

                t.next = node;

                return t;

            }

        }

    }

}




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

    boolean failed = true;

    try {

        boolean interrupted = false;

        // 不断循环

        for (;;) {

            // 获取当前节点的前驱节点,如果前驱节点为null将会抛出空指针异常

            final Node p = node.predecessor();

            // 如果当前节点的前驱节点是头节点,尝试获取同步状态

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

                // 设置当前节点为头节点,并且将节点线程和节点的前驱节点置为null,help GC

                setHead(node);

                p.next = null; // help GC

                failed = false;

                return interrupted;

            }

            // 如果不符合条件,则判断当前节点前驱节点的waitStatus状态来决定是否需要挂起LockSupport.park(this);

            if (shouldParkAfterFailedAcquire(p, node) &&

                parkAndCheckInterrupt())

                interrupted = true;

        }

    } finally {

        // 失败则取消

        if (failed)

            cancelAcquire(node);

    }

}

2、比较

Java代码在编译后都会装换为虚拟机可以识别的字节码,我们通过编译器对两者生成的字节码从原理是来观察两者的区别

2.1 测试代码for


package com.liziba.jsw;



public class Test {



    private static void m1() {

        for (;;) {



        }

    }

    

}

通过 javap -v Test.class查看生成的字节码(只截取关键部分)

2.2 测试代码while


package com.liziba.jsw;





public class Test {

    

    private static void m2() {

        while (true){



        }

    }

    

}

通过 javap -v Test.class查看生成的字节码(只截取关键部分)

3、结论

for死循环和while死循环编译后的字节码(编译器是可以做优化的),完全一模一样,所以两者在使用过程中,其实是没有任何区别。看到这里是不是有点生气,但是又想问问什么源码那些大佬写代码基本上不用while(true),我想主要原因还是早期C语言for(;;)循环和while(1)编译生成的字节码不一样,for(;;)生成的字节码明显更加少,一定程度上能节省一些内存空间。所以很多java大佬,也是精通各种其他语言的,因此写法习惯也就延续下来了吧。再者,我在查阅资料的时候也看到有笔者验证早期的Java编译器对for死循环编译生成的字节码也是少于while死循环编译后生成的字节码,可能随着编译器优化能力不断的增强,现在这两者在目前广泛使用的编译器中已经没有什么区别了。

到此这篇关于 Javafor(;;)while(true)的区别的文章就介绍到这了,更多相关for(;;)while(true)的区别内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Java中for(;;)和while(true)的区别

本文链接: https://www.lsjlt.com/news/158358.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java中for(;;)和while(true)的区别
    目录1、问题来源2、比较2.1 测试代码for2.2 测试代码while3、结论 1、问题来源 在阅读Java的JDK源码时,发现大部分写源码的大佬多采用for(;;)的方式来死循环...
    99+
    2022-11-12
  • Java中for(;;)和while(true)的区别是什么
    今天就跟大家聊聊有关Java中for(;;)和while(true)的区别是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。1、问题来源在阅读Java的JDK源码时,发现大部分写源...
    99+
    2023-06-21
  • Java里的for (;;)与while (true)哪个更快
    本篇内容介绍了“Java里的for (;;)与while (true)哪个更快”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!在JDK8u的j...
    99+
    2023-06-19
  • Java循环语句for,、while以及do…while的用法区别
    本篇内容介绍了“Java循环语句for,、while以及do…while的用法区别”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Java 循...
    99+
    2023-06-02
  • c语言for、while和do-while循环之间的区别
    for,while,do-while区别 循环结构 1、初始化变量:for循环当中定义的初始化变量,只有自己才能用;while和do-while循环,初始化变量本来就在外面,所以外...
    99+
    2022-11-12
  • continue在while与for的区别 javascript
    JavaScript是一种非常流行的编程语言,它具有多种语法结构和控制流程。其中,while和for循环在JavaScript编程中非常常见。在这两种循环中,都有一个关键字“continue”,它用来跳过当前循环中的某个迭代。然而,它们之间...
    99+
    2023-05-17
  • java中if和while的区别是什么?
    java中if和while的区别是什么?while和if本身就用法不同,一个是循环语句,一个是判断语句。if 就是一个判断的,如果满足后面的条件就继续运行if语句里面的东西的,要是不满足就跳出来,执行else语句或执行下面的语句的 。whi...
    99+
    2021-03-09
    java教程 java if while
  • c语言for、while和do-while循环之间的区别有哪些
    这篇文章主要介绍c语言for、while和do-while循环之间的区别有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!for,while,do-while区别循环结构初始化变量:for循环当中定义的初始化变量,...
    99+
    2023-06-26
  • Shell编程中while与for的区别有哪些
    这篇文章给大家分享的是有关Shell编程中while与for的区别有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、常用语法1、for循环for循环常用的语法结构有如下几种:for 变量 in seq字符串...
    99+
    2023-06-09
  • php中while和do...while的区别是什么
    小编给大家分享一下php中while和do...while的区别是什么,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!php的框架有哪些php的框架:1、Larav...
    99+
    2023-06-14
  • Shell编程中while与for的区别及用法详解
    在shell编程中经常用到循环,常用的循环有for和while循环两种。while循环默认以行读取文件,而for循环以空格读取文件切分文件,本篇就结合现网的一些使用示例说说二者的用法和区别。 一、常用语法 ...
    99+
    2022-06-04
    详解 区别 Shell
  • Java中for与foreach的区别
    目录(1)遍历元素(2)删除元素(3)修改元素(4)foreach修改元素属性总结之前有一个同事突然我问了我一个问题,说在foreach当中能不能删除list里面的元素,我当时大概说...
    99+
    2022-11-13
  • 关于useSSL=false和true的区别及说明
    目录useSSL=false和true的区别useSSL=false 连接配置详解SSL协议提供服务主要当前支持SSL协议两层解决方案如下useSSL=false和true的区别 SSL(Secure Sockets L...
    99+
    2022-08-18
    useSSL=false useSSL=true useSSL=false和true区别
  • C语言中的return true和return false有什么区别
    在C语言中,return true和return false是用于表示一个函数的返回值是真(true)或假(false)。它们的区别...
    99+
    2023-08-19
    C语言
  • Java中for与foreach的区别是什么
    本篇内容主要讲解“Java中for与foreach的区别是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java中for与foreach的区别是什么”吧!(1)遍历元素首先,我们一一段代码为...
    99+
    2023-06-30
  • for of 和 for in 的区别介绍
    目录1.共性2.区别1.两者对比例子(遍历对象)2.两者对比例子(遍历数组)3.特点①. for in 特点简述for in 和 for of 的区别1.共性 for of 和 fo...
    99+
    2022-12-19
    for of 和 for in 的区别 for of 和 for in 的用法区别
  • JS中for,for...in,for...of和forEach的区别和用法实例
    for循环 基本语法格式:  for(初始化变量;条件表达式;操作表达式){         &n...
    99+
    2022-11-12
  • 详谈python中subprocess shell=False与shell=True的区别
    shell=True参数会让subprocess.call接受字符串类型的变量作为命令,并调用shell去执行这个字符串,当shell=False是,subprocess.call只...
    99+
    2022-11-12
  • JavaScript中for-in和for-of有什么区别
    今天就跟大家聊聊有关JavaScript中for-in和for-of有什么区别,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。JavaScript是什么JavaScript是一种直译式...
    99+
    2023-06-14
  • for循环中 i++ 和 ++i 区别
    一、for循环中 i++的使用 for (int i = 0;i < 10;i++){ } 二、for循环中 ++i 的使用 for (int i = 0;i ...
    99+
    2023-09-12
    java c++ 开发语言 Powered by 金山文档
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作