目录

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

编程中各种锁的区别有: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的线程


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