zoukankan      html  css  js  c++  java
  • 自旋锁与适应性自旋锁

    java中根据某一特性定义的锁进行分类,

    2、自旋锁与适应性自旋锁

    分类定义:锁住同步资源失败,要不要进行阻塞

    1、概念

    自旋锁的概念。阻塞或唤醒一个Java线程需要操作系统切换CPU状态来完成,这种状态转换需要耗费处理器时间。如果同步代码块中的内容过于简单,状态转换消耗的时间有可能比用户代码执行的时间还要长。减少cpu切换

    在许多场景中,同步资源的锁定时间很短,为了这一小段时间去切换线程,线程挂起和恢复现场的花费可能会让系统得不偿失。如果物理机器有多个处理器,能够让两个或以上的线程同时并行执行,我们就可以让后面那个请求锁的线程不放弃CPU的执行时间,看看持有锁的线程是否很快就会释放锁。

    而为了让当前线程“稍等一下”,我们需让当前线程进行自旋,如果在自旋完成后前面锁定同步资源的线程已经释放了锁,那么当前线程就可以不必阻塞而是直接获取同步资源,从而避免切换线程的开销。这就是自旋锁。

    如图所示:

    缺点:自旋锁本身是有缺点的,它不能代替阻塞。自旋等待虽然避免了线程切换的开销,但它要占用处理器时间。如果锁被占用的时间很短,自旋等待的效果就会非常好。反之,如果锁被占用的时间很长,那么自旋的线程只会白浪费处理器资源。所以,自旋等待的时间必须要有一定的限度,如果自旋超过了限定次数(默认是10次,可以使用-XX:PreBlockSpin来更改)没有成功获得锁,就应当挂起线程。

    原理:自旋锁的实现原理同样也是CAS

    适应性自旋锁:自适应意味着自旋的时间(次数)不再固定,而是由前一次在同一个锁上的自旋时间及锁的拥有者的状态来决定。如果在同一个锁对象上,自旋等待刚刚成功获得过锁,并且持有锁的线程正在运行中,那么虚拟机就会认为这次自旋也是很有可能再次成功,进而它将允许自旋等待持续相对更长的时间。如果对于某个锁,自旋很少成功获得过,那在以后尝试获取这个锁时将可能省略掉自旋过程,直接阻塞线程,避免浪费处理器资源说

    学有所思,思有所成。
  • 相关阅读:
    shell脚本快速配置yum源
    RAID 5+1
    RAID 10
    TFTP
    CentOS7 初始化脚本 2.0
    CentOS7 初始化脚本 1.0
    Tomcat CGI 轻松打造 Web 服务
    Python 变量类型 —— type() 函数和 isinstance() 函数
    Python源码换行
    RFC 文档搜索与阅读
  • 原文地址:https://www.cnblogs.com/lqh969696/p/14663186.html
Copyright © 2011-2022 走看看