首页 > 编程语言 >java Thread.sleep(0) 有什么用

java Thread.sleep(0) 有什么用

时间:2022-09-20 19:34:15浏览次数:88  
标签:java Thread int 安全 循环 线程 sleep cpu

 

RocketMQ  中出现 org.apache.rocketmq.store.logfile.DefaultMappedFile#warmMappedFile

 

作用的交出cpu控制权, 在unix中 使用是时间片算法,而在windows中是抢占式。

在时间片算法中,所有进程使用队列排队。操作系统会按他们的顺序进行分配时间进行执行。该进程在该时间内执行,如果超过时间还没执行完成,将会被剥夺cpu使用权并分配给另外一个进程。如果在该时间内结束或者阻塞。则cpu切换给其他进行。

抢战式就是一个进行得到cpu使用权,除非他主动放弃。不然就会一直霸占这个cpu。 Thead.sleep(0),就是当前线程放弃cpu使用。触发操作系统争夺cpu的争夺。如果更高级别的优先权的进程或者线程要使用,则cpu交给他们使用,没有的话还会返回到当前进程。

而这里因为是for的int ,没有安全点,所以要等到循环结束后才会触发 触发安全点检查 (比如触发GC回收) ,而上面图片中进行让每1000进行触发 安全点检查, 而不是每次都进行。

所以如果for 里面的int循环太多,进行会发生内存溢出的情况,因为没有及时GC。  

通过上图的int循环就可以看出来,sleep(1000) 之后,主线程执行结果是等int 循环结束才进行返回 结果的,for循环中没有进行 安全点检查,等结束才进行,也可以for结束了才进行GC 。这都是因为int是可数循环( 后续有介绍) 。

 

 

而上图中进行了sleep(0) ,因为吧cpu从当前线程中交出,所以进行了安全点检查,进行GC回收。

 

 

通过上图的long循环就可以看出来,sleep(1000) 之后,主线程马上执行结果,而不是等待long循环结束。

 

下面讲解下 safepoint ,也就是安全点

关于安全点的描述,我们可以看看《深入理解JVM虚拟机(第三版)》的 3.4.2 小节:

 

可数循环和不可数循环

 

是HotSpot虚拟机为了避免安全点过多带来过重的负担,对循环还有一项优化措施,认为循环次数较少的话,执行时间应该也不会太长,所以使用int类型或范围更小的数据类型作为索引值的循环默认是不会被放置安全点的。这种循环被称为可数循环(Counted Loop),相对应地,使用long或者范围更大的数据类型作为索引值的循环就被称为不可数循环(Uncounted Loop),将会被放置安全点。

 

意思就是在可数循环(Counted Loop)的情况下,HotSpot 虚拟机搞了一个优化,就是等循环结束之后,线程才会进入安全点。

反过来说就是:循环如果没有结束,线程不会进入安全点,GC 线程就得等着当前的线程循环结束,进入安全点,才能开始工作。

 

另外调用native 返回的时候也会触发安全检查,因为native不属于jvm里面。所以从native回来的时候会触发

建议仔细看完why技术 写的文章《没有二十年功力,写不出sleep(0)这一行“看似无用”的代码》

 

引用:

  

面试官:Thread.sleep(0) 有什么用

没有二十年功力,写不出sleep(0)这一行

JVM系列之:再谈java中的safepoint

 

标签:java,Thread,int,安全,循环,线程,sleep,cpu
From: https://www.cnblogs.com/zhian/p/16712203.html

相关文章

  • javascript的API和跨域问题
    document.getElementById(),根据ID来精确查找元素document.querySelectorAll(),根据选择器来查找,返回一个或者多个元素document.querySelector(),根据选择器来查找,同类多个......
  • JavaScript 工具函数:随机取自然数
    functionrandomUint(max){returnMath.floor(Math.random()*max);}Math.random()*max返回的是大于0的浮点数,不能四舍五入取整。用Math.floor()对上一个结果......
  • Java中的clone
    Java中对象的创建使用new操作符创建一个对象使用clone方法复制一个对象两种方式的异同new操作符的本意是分配内存。程序执行到new操作符时,首先去看new操作符后面的......
  • java-stream-函数式接口
    一、概述java是面向对象的,对象往往映射现实生活中的某个具体的东西,绝大多数保存在java内存的堆中;java的函数式编程,则可以将对象指向一个函数(行为),而非具体的东西;函数式接......
  • 什么是Java中的魔法值?
    使用IDEA时,启用了阿里的代码规范检查,其中就有一项提示是不允许任何魔法值出现在代码里,于是出于好奇就了解一下到底啥时魔法值。介绍魔法数值、魔法数字、魔法值,这是一......
  • java流之装饰者模式
    扩展类在于继承FilterInputStream,从而增强read和writer方法的能力输出流同样如此。   推荐文章:https://blog.csdn.net/hustzw07/article/details/80795855......
  • 全局唯一ID生成器(SnowFlakeId算法JAVA实现)
    importorg.apache.commons.lang3.RandomUtils;importjava.util.Random;/***@Description:全局唯一Id生成器*@Author:yk*@Create:2022-09-2016:55*/p......
  • Java 中 IO 流
    Java中IO流分为几种?按照流的流向分,可以分为输入流和输出流;按照操作单元划分,可以划分为字节流和字符流;按照流的角色划分为节点流和处理流。JavaIo流共涉及40......
  • Java处理Linux软连接文件
    这是几年前写的旧文,此前发布Wordpress小站上,现在又重新整理。算是温故知新,后续会继续整理。如有错误望及时指出,在此感谢。背景:运维同学反馈有一个部署很久的线上业务组......
  • 前端面试题JavaScript篇——2022-09-20
    每日3题1以下代码执行后,控制台中的输出内容为?//index.jsconsole.log(1);import{sum}from"./sum.js";console.log(sum(1,2));//sum.jsconsole.log(2);exp......