之前讲了《AQS源码阅读》和《ReentrantLock源码阅读》,本次将延续阅读下ReentrantReadWriteLock,建议没看过之前两篇文章的,先大概了解下,有些内容会基于之前的基础上阅读。
这个并不是ReentrantLock简单的升级,而是落地场景的优化,我们来详细了解下吧。
背景
JUC包里面已经有一个ReentrantLock了,为何还需要一个ReentrantReadWriteLock呢?看看头注解找点线索。
它是ReadWriteLock接口的实现。那看看这个接口怎么说
之前讲了《AQS源码阅读》和《ReentrantLock源码阅读》,本次将延续阅读下ReentrantReadWriteLock,建议没看过之前两篇文章的,先大概了解下,有些内容会基于之前的基础上阅读。
这个并不是ReentrantLock简单的升级,而是落地场景的优化,我们来详细了解下吧。
JUC包里面已经有一个ReentrantLock了,为何还需要一个ReentrantReadWriteLock呢?看看头注解找点线索。
它是ReadWriteLock接口的实现。那看看这个接口怎么说
AQS,全称AbstractQueuedSynchronizer
,是Concurrent包锁的核心,没有AQS就没有Java的Concurrent包。它到底是个什么,我们来看看源码的第一段注解是怎么说明
为了性能与使用的场景,Java实现锁的方式有非常多。而关于锁主要的实现包含synchronized关键字、AQS框架下的锁,其中的实现都离不开以下的策略。
全称为 Compare and Swap。CAS有三个操作数,内存值V,旧预期值(已获得的旧数据)A,修改新值B。当且仅当V与A的值相同(compare),才能把V替换为B(Swap)。其中Java中内存值可以通过volatile关键字标识获取,该关键词可以使变量对所有线程实时可见。
Java与C最大的区别或许就是Java拥有垃圾回收(Garbage Collect)功能,可以让开发人员无需过多关心程序中的对象内存如何管理,更专注于业务的开发。但是如果不好好了解GC,也遇到性能瓶颈时很难容易的解决。
GC回收的对象是无用的对象,狭义是没有被引用的对象。如何在内存中找到这些对象,一般有以下两种