回顾前面:微信
只有光头才能变强!多线程
上一篇已经将Lock锁的基础AQS简单地过了一遍了,所以本篇主要是讲解Lock锁主要的两个子类:框架
那么接下来咱们就开始吧~post
首先咱们来看看ReentrantLock锁的顶部注释,来看看他的相关特性呗:学习
来总结一下要点吧:ui
class X { private final ReentrantLock lock = new ReentrantLock(); // ... public void m() { lock.lock(); // block until condition holds try { // ... method body } finally { lock.unlock() } } }
首先咱们能够看到有三个内部类:spa
这些内部类都是AQS的子类,这就印证了咱们以前所说的:AQS是ReentrantLock的基础,AQS是构建锁、同步器的框架线程
尝试获取锁,获取失败的话就调用AQS的acquire(1)
方法3d
acquire(1)
方法咱们在AQS时简单看过,其中tryAcquire()
是子类来实现的code
咱们去看看tryAcquire()
:
公平的lock方法其实就多了一个状态条件:
这个方法主要是判断当前线程是否位于CLH同步队列中的第一个。若是是则返回flase,不然返回true。
unlock方法也是在AQS中定义的:
去看看tryRelease(arg)
是怎么实现的:
咱们知道synchronized内置锁和ReentrantLock都是互斥锁(一次只能有一个线程进入到临界区(被锁定的区域))
而ReentrantReadWriteLock是一个读写锁:
通常来讲:咱们大多数都是读取数据得多,修改数据得少。因此这个读写锁在这种场景下就颇有用了!
读写锁有一个接口ReadWriteLock,定义的方法就两个:
咱们仍是来看看顶部注释说得啥吧:
其实大概也是说明了:在读的时候能够共享,在写的时候是互斥的
接下来咱们仍是来看看对应的实现类吧:
按照惯例也简单看看它的顶部注释:
因而咱们能够总结出读写锁的一些要点了:
ReentrantReadWriteLock比ReentrantLock锁多了两个内部类(都是Lock实现)来维护读锁和写锁,可是主体仍是使用Syn:
在ReentrantLock锁上使用的是state来表示同步状态(也能够表示重入的次数),而在ReentrantReadWriteLock是这样表明读写状态的:
主要仍是调用syn的acquire(1)
:
进去看看实现:
写锁的获取调用的是acquireShared(int arg)
方法:
内部调用的是:doAcquireShared(arg);
方法(实现也是在Syn的),咱们来看看:
这里就简单总结一下本文的内容吧:
总的来讲看多线程源码难度系数仍是好高啊,我目前的水平只能过一过了....
多线程后面还有挺多高深的知识点:Future、同步容器啊、阻塞队列、各类原子类啊等等等,这里我打算就先放一放了,目前的水平有限啊~~~~~
后面可能会有一篇线程池的博文,敬请期待咯~
有兴趣的同窗可继续往下面的参考资料下学习~~~
参考资料:
若是文章有错的地方欢迎指正,你们互相交流。习惯在微信看技术文章,想要获取更多的Java资源的同窗,能够关注微信公众号:Java3y。为了你们方便,刚新建了一下qq群:742919422,你们也能够去交流交流。谢谢支持了!但愿能多介绍给其余有须要的朋友
文章的目录导航: