• Java-锁与实现


    1. 锁的分类与实现

    2. 具体实现

      可重入锁:

      可重入锁又名递归锁,是指在同一个线程在外层方法获取锁的时候,在进入内层方法会自动获取锁。

      偏向锁/轻量级锁/重量级锁:

      偏向锁:指一段同步代码一直被一个线程所访问,那么该线程会自动获取锁。降低获取锁的代价。
      轻量级锁:指当锁是偏向锁的时候,被另一个线程所访问,偏向锁就会升级为轻量级锁,其他线程会通过自旋的形式尝试获取锁,不会阻塞,提高性能。
      重量级锁:指当锁为轻量级锁的时候,另一个线程虽然是自旋,但自旋不会一直持续下去,当自旋一定次数的时候,还没有获取到锁,就会进入阻塞,该锁膨胀为重量级锁。重量级锁会让其他申请的线程进入阻塞,性能降低。

      自旋锁:

      自旋锁:指尝试获取锁的线程不会立即阻塞,而是采用循环的方式去尝试获取锁,这样的好处是减少线程上下文切换的消耗,缺点是循环会消耗CPU。

      具体实现:

      使用CAS原子操作,lock函数将owner设置为当前线程,并且预测原来的值为空。unlock函数将owner设置为null,并且预测值为当前线程。

    当有第二个线程调用lock操作时由于owner值不为空,导致循环一直被执行,直至第一个线程调用unlock函数将owner设置为null,第二个线程才能进入临界区。

    由于自旋锁只是将当前线程不停地执行循环体,不进行线程状态的改变,所以响应速度更快。但当线程数不停增加时,性能下降明显,因为每个线程都需要执行,占用CPU时间。如果线程竞争不激烈,并且保持锁的时间段。适合使用自旋锁。

      

  • 相关阅读:
    centos nginx 405错误
    使用Python自带模块发送邮件
    centos 文件权限问题chmod
    Python发送企业微信群机器人消息
    centos 如何查看用户
    linux中的.bashrc文件
    gunicorn的用法
    测试内容上线之后,要进行线上验证和持续的跟进,这应该变成一个职业习惯,这是为了自己的事情负责
    测试平台使用git+Jenkins进行持续集成
    Nginx配置使用详解
  • 原文地址:https://www.cnblogs.com/Z-D-/p/12685792.html
Copyright © 2020-2023  润新知