通过与 Jira 对比,让您更全面了解 PingCode

  • 首页
  • 需求与产品管理
  • 项目管理
  • 测试与缺陷管理
  • 知识管理
  • 效能度量
        • 更多产品

          客户为中心的产品管理工具

          专业的软件研发项目管理工具

          简单易用的团队知识库管理

          可量化的研发效能度量工具

          测试用例维护与计划执行

          以团队为中心的协作沟通

          研发工作流自动化工具

          账号认证与安全管理工具

          Why PingCode
          为什么选择 PingCode ?

          6000+企业信赖之选,为研发团队降本增效

        • 行业解决方案
          先进制造(即将上线)
        • 解决方案1
        • 解决方案2
  • Jira替代方案

25人以下免费

目录

编程中各种锁都有什么区别

编程中各种锁的区别有:1. ReentrantLock底层实现依赖于特殊的CPU指令;2. 同步器是实现同步组件的关键,锁是面向使用者的;3. 重入锁ReentrantLock支持一个线程对资源的重复枷锁;4.ReentrantReadWriteLock读写锁可以允许同一时刻多个读线程访问。

一、编程中各种锁的区别

1. ReentrantLock底层实现依赖于特殊的CPU指令

Java1.5引入了Lock接口以及相关的实现类,提供了和synchronized类似的同步功能。相比synchronized的隐式加锁和释放。Lock需要手动操作。少了便捷性,但却可以更加灵活和高效。

ReentrantLock底层实现依赖于特殊的CPU指令,比如发送lock指令和unlock指令,不需要用户态和内核态的切换,所以效率高(这里和volatile底层原理类似),而synchronized底层由监视器锁(monitor)是依赖于底层的操作系统的Mutex Lock需要用户态和内核态的切换,所以效率低。

2. 同步器是实现同步组件的关键,锁是面向使用者的

同步器是实现同步组件的关键,锁是面向使用者的,它定义了使用者与锁交互的接口,隐藏了实现的细节;同步器面向的是锁的实现者,它简化了锁的实现,屏蔽了同步状态管理、线程的排队、等待与唤醒等底层实现。锁和同步器很好的隔离了使用者和实现者所关注的领域。只有掌握了同步器的工作原理才能更深入地理解并发包中其他的并发组件。

3. 重入锁ReentrantLock支持一个线程对资源的重复枷锁

重入锁ReentrantLock支持一个线程对资源的重复枷锁,该线程自己不会阻塞自己。常用的使用方式如下class X {

   private final ReentrantLock lock = new ReentrantLock();

   public void m() {

     lock.lock();  // block until condition holds

     try {

       // ... method body

     } finally {

       lock.unlock()

     }

   }

 }

4. ReentrantReadWriteLock读写锁可以允许同一时刻多个读线程访问

ReentrantLock是排他锁,即同一时刻只允许一个线程进行访问,而ReentrantReadWriteLock读写锁可以允许同一时刻多个读线程访问,但在写线程访问时,所有的多线程和其他的写线程都会被阻塞;如果存在读锁,正在持有中,则写锁不能被获取,要等待当前激活的读锁释放。通过维护一个读锁和一个写锁,分离读和写,使得并发性有很大的提升。

延伸阅读:

二、Condition

获取一个Condition必须通过Lock的newCondition()方法。重用的方法如下

  • await() throw InterruptedException: 当前线程进入等待状态知道被通知或者中断,当前线程进入运行状态且从await()方法返回
  • awaitUninterruptibly(): 对中断不敏感的await
  • awaitNanos(long nanosTimeout) throw InterruptedException:在await的基础上增加了超时被中断的功能
  • signal() 唤醒一个等待在Condition上的线程,该线程从等待方法返回前必须获取与Condition相关联的锁
  • signalAll().唤醒所有在等待Condition的线程


以上就是关于编程中各种锁都有什么区别的内容希望对大家有帮助。

相关文章