当前位置:   article > 正文

JUC学习笔记 -- (9) ReadWriteLock读写锁的使用_juc下的读写锁如何使用

juc下的读写锁如何使用

  说到Java并发编程,很多开发第一个想到同时也是经常常用的肯定是Synchronized,但是Synchronized存在明显的一个性能问题就是读与读之间互斥,简言之就是,我们编程想要实现的最好效果是,可以做到读和读互不影响,读和写互斥,写和写互斥,提高读写的效率,这就要用到本章的重点ReadWriteLock读写锁。

之前文章已经介绍了Lock的一种实现ReentrantLock的使用,其在功能上和Synchronized相同,只不过这个更具灵活性。而本章介绍的ReadWriteLock也是Lock的一种实现,而且相对于ReentrantLock和Synchronized,ReadWriteLock在性能上更具优势。

Java并发包中ReadWriteLock是一个接口,主要有两个方法,如下:

  1. public interface ReadWriteLock {
  2. /**
  3. * Returns the lock used for reading.
  4. *
  5. * @return the lock used for reading
  6. */
  7. Lock readLock();
  8. /**
  9. * Returns the lock used for writing.
  10. *
  11. * @return the lock used for writing
  12. */
  13. Lock writeLock();
  14. }

ReadWriteLock管理一组锁,一个是只读的锁,一个是写锁。
Java并发库中ReetrantReadWriteLock实现了ReadWriteLock接口并添加了可重入的特性。
在具体讲解ReetrantReadWriteLock的使用方法前,我们有必要先对其几个特性进行一些深入学习了解。

1. ReetrantReadWriteLock特性说明

1.1 获取锁顺序

  • 非公平模式(默认)
    当以非公平初始化时,读锁和写锁的获取的顺序是不确定的。非公平锁主张竞争获取,可能会延缓一个或多个读或写线程,但是会比公平锁有更高的吞吐量。
  • 公平模式
    当以公平模式初始化时,线程将会以队列的顺序获取锁。当当前线程释放锁后,等待时间最长的写锁线程就会被分配写锁;或者有一组读线程组等待时间比写线程长,那么这组读线程组将会被分配读锁。

1.2 可重入

什么是可重入锁,不可重入锁呢?"重入"字面意思已经很明显了,就是可以重新进入。可重入锁,就是说一个线程在获取某个锁后,还可以继续获取该锁,即允许一个线程多次获取同一个锁。比如synchronized内置锁就是可重入的,如果A类有2个synchornized方法method1和method2,那么method1调用method2是允许的。显然重入锁给编程带来了极大的方便。假如内置锁不是可重入的,那么导致的问题是:1个类的synchornized方法不能调用本类其他synchornized方法,也不能调用父类中的synchornized方法。与内置锁对应,JDK提供的显示锁ReentrantLock也是可以重入的,这里通过一个例子着重说下可重入锁的释放需要的事儿。

  1. public class Test1 {
  2. public static void main(String[] args) throws InterruptedException {
  3. final ReentrantReadWriteLock lock = new ReentrantReadWriteLock ();
  4. Thread t = new Thread(new Runnable() {
  5. @Override
  6. public void run() {
  7. lock.writeLock().lock();
  8. System.out.println("Thread real execute");
  9. lock.writeLoc
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小桥流水78/article/detail/956183
推荐阅读
相关标签
  

闽ICP备14008679号