Lock锁子类了解一下(二)

简介: 笔记

二、ReentrantReadWriteLock


我们知道synchronized内置锁和ReentrantLock都是互斥锁(一次只能有一个线程进入到临界区(被锁定的区域))

而ReentrantReadWriteLock是一个读写锁

  • 取数据的时候,可以多个线程同时进入到到临界区(被锁定的区域)
  • 数据的时候,无论是读线程还是写线程都是互斥

一般来说:我们大多数都是读取数据得多,修改数据得少。所以这个读写锁在这种场景下就很有用了!

读写锁有一个接口ReadWriteLock,定义的方法就两个:

42.jpg

我们还是来看看顶部注释说得啥吧:

43.jpg

其实大概也是说明了:在读的时候可以共享,在写的时候是互斥的

接下来我们还是来看看对应的实现类吧:

44.jpg

按照惯例也简单看看它的顶部注释:

45.jpg

于是我们可以总结出读写锁的一些要点了:

  • 读锁不支持条件对象,写锁支持条件对象
  • 读锁不能升级为写锁,写锁可以降级为读锁
  • 读写锁也有公平和非公平模式
  • 读锁支持多个读线程进入临界区,写锁是互斥的


2.1ReentrantReadWriteLock内部类


ReentrantReadWriteLock比ReentrantLock锁多了两个内部类(都是Lock实现)来维护读锁和写锁,但是主体还是使用Syn

  • WriteLock
  • ReadLock

46.jpg


2.2读锁和写锁的状态表示


在ReentrantLock锁上使用的是state来表示同步状态(也可以表示重入的次数),而在ReentrantReadWriteLock是这样代表读写状态的:

47.jpg


2.3写锁的获取


主要还是调用syn的acquire(1)

48.jpg

进去看看实现:

49.jpg


2.4读锁获取


写锁的获取调用的是acquireShared(int arg)方法:

50.jpg

内部调用的是:doAcquireShared(arg);方法(实现也是在Syn的),我们来看看:

51.jpg


三、最后


这里就简单总结一下本文的内容吧:

  • AQS是ReentrantReadWriteLock和ReentrantLock的基础,因为默认的实现都是在内部类Syn中,而Syn是继承AQS的~
  • ReentrantReadWriteLock和ReentrantLock都支持公平和非公平模式,公平模式下会去看FIFO队列线程是否是在队头,而非公平模式下是没有的
  • ReentrantReadWriteLock是一个读写锁,如果读的线程比写的线程要多很多的话,那可以考虑使用它。它使用state的变量高16位是读锁,低16位是写锁
  • 写锁可以降级为读锁,读锁不能升级为写锁
  • 写锁是互斥的,读锁是共享的

总的来说看多线程源码难度系数还是好高啊,我目前的水平只能过一过了….

多线程后面还有挺多高深的知识点:Future、同步容器啊、阻塞队列、各种原子类啊等等等,这里我打算就先放一放了,目前的水平有限啊~

后面可能会有一篇线程池的博文,敬请期待咯~

目录
相关文章
|
8月前
|
安全 Java
Synchronized和Lock的区别
Synchronized和Lock的区别
79 0
|
5月前
|
Java 开发者
揭秘!为什么大神都爱用Lock接口处理线程同步?
揭秘!为什么大神都爱用Lock接口处理线程同步?
85 5
|
7月前
|
安全 Java
synchronized与Lock
synchronized与Lock
|
Java
synchronized和lock的区别
synchronized和lock的区别
94 0
|
Java
Lock 和 Synchronized的区别?
本章主要讲解了Lock 和 Synchronized的区别和知识点
57 0
|
Java
synchronized和Lock的区别
synchronized和Lock的区别
78 0
|
安全 Java
synchronized 锁与 ReentrantLock 锁的区别
synchronized 锁与 ReentrantLock 锁的区别
120 0
线程同步的方法:Synchronized、Lock、ReentrantLock分析
线程同步的方法:Synchronized、Lock、ReentrantLock分析
|
Java
既生 synchronized 何生 JUC 的 显式 locks ?
既生 synchronized 何生 JUC 的 显式 locks ?
118 0
|
安全 Java
Lock和Synchronized的区别
Lock和Synchronized的区别
Lock和Synchronized的区别