当前位置:博威奇培训网 > 电脑IT > 程序开发

[程序开发]Java中的自旋锁

查看:

黄老师黄老师

最后更新: 2020-08-31 17:23:39

  未上传身份证认证 身份证未认证   未上传营业执照认证 营业执照未认证

商家信息
Java中的自旋锁
  • 13430300330
  • 13430300330

联系我时,请说是在【博威奇培训网】看到的,我会给您最大的优惠!

投诉举报 发布信息
Java中的自旋锁货源详情
自旋锁原理非常简单,如果持有锁的线程能在很短时间内释放锁资源,那么那些等待竞争锁的线程就不需要做内核态和用户态之间的切换进入阻塞挂起状态,它们只需要等一等(自旋),等持有锁的线程释放锁后即可立即获取锁,这样就避免用户线程和内核的切换的消耗。 但是线程自旋是需要消耗cup的,说白了就是让cup在做无用功,如果一直获取不到锁,那线程也不能一直占用cup自旋做无用功,所以需要设定一个自旋等待的最大时间。如果持有锁的线程执行的时间超过自旋等待的最大时间扔没有释放锁,就会导致其它争用锁的线程在最大等待时间内还是获取不到锁,这时争用线程会停止自旋进入阻塞状态。自旋锁的优缺点自旋锁尽可能的减少线程的阻塞,这对于锁的竞争不激烈,且占用锁时间非常短的代码块来说性能能大幅度的提升,因为自旋的消耗会小于线程阻塞挂起再唤醒的操作的消耗,这些操作会导致线程发生两次上下文切换!但是如果锁的竞争激烈,或者持有锁的线程需要长时间占用锁执行同步块,这时候就不适合使用自旋锁了,因为自旋锁在获取锁前一直都是占用cpu做无用功,占着XX不XX,同时有大量线程在竞争一个锁,会导致获取锁的时间很长,线程自旋的消耗大于线程阻塞挂起操作的消耗,其它需要cup的线程又不能获取到cpu,造成cpu的浪费。所以这种情况下我们要关闭自旋锁;自旋锁时间阈值自旋锁的目的是为了占着CPU的资源不释放,等到获取到锁立即进行处理。但是如何去选择自旋的执行时间呢?如果自旋执行时间太长,会有大量的线程处于自旋状态占用CPU资源,进而会影响整体系统的性能。因此自旋的周期选的额外重要!JVM对于自旋周期的选择,jdk1.5这个限度是一定的写死的,在1.6引入了适应性自旋锁,适应性自旋锁意味着自旋的时间不在是固定的了,而是由前一次在同一个锁上的自旋时间以及锁的拥有者的状态来决定,基本认为一个线程上下文切换的时间是最佳的一个时间,同时JVM还针对当前CPU的负荷情况做了较多的优化如果平均负载小于CPUs则一直自旋如果有超过(CPUs/2)个线程正在自旋,则后来线程直接阻塞如果正在自旋的线程发现Owner发生了变化则延迟自旋时间(自旋计数)或进入阻塞如果CPU处于节电模式则停止自旋自旋时间的最坏情况是CPU的存储延迟(CPU A存储了一个数据,到CPU B得知这个数据直接的时间差)自旋时会适当放弃线程优先级之间的差异自旋锁的开启JDK1.6中-XX:+UseSpinning开启; -XX:PreBlockSpin=10 为自旋次数; JDK1.7后,去掉此参数,由jvm控制联系地址:沣宏大厦3楼
程序开发发布货源

今日:0 | 程序开发:666 | 所有: 2253

版权所有:博威奇培训网【Boweiqi.com】 Copyright 2014-2020
侵权、举报、投诉、删除信息联系邮箱:services@maigela.com 客服QQ:55933123 我们承诺只要联系到客服人员,当即解决问题不会超过2小时!
免责声明: 请您仔细甄别信息的真实性与安全性,本站不承担任何由用户所发布信息而引起的争议和法律责任
蜀ICP备20024995号