Java 锁系列(四)——ReentrantLock源码Condition实现分析

Condition 是个接口,依赖于 Lock 接口的实现,基本的方法就是 await() 和 signal() 方法,是在 java 1.5 中才出现的,用于替代 Object 的 wait()、notify() 实现线程间的协作,相比使用 Object 的 wait()、notify(),使用 Condition 的 await()、signal() 这种方式实现线程间协作更加安全和高效。因此通常来说比较推荐使用Condition,阻塞队列实际上是使用了Condition来模拟线程间协作。

Java 锁系列(七)——StampedLock源码分析

StampedLock 是读写锁的实现,对比 ReentrantReadWriteLock 主要不同是该锁不允许重入,多了乐观读的功能,使用上会更加复杂一些,且仅支持非公平锁,但是具有更好的性能表现。StampedLock 的状态由版本和模式组成。 获取锁方法返回一个邮戳,表示和控制与锁状态相关的访问; 这些方法的“尝试”邮戳可能会返回特殊值 0 来表示获取锁失败。 锁释放和转换方法需要标记作为参数,如果它们与锁的状态不匹配则失败。本文对 StampedLock 的实现源码进行分析。

Java 锁系列(六)——StampedLock使用

StampedLock 是读写锁的实现,对比 ReentrantReadWriteLock 主要不同是该锁不允许重入,多了乐观读的功能,使用上会更加复杂一些,但是具有更好的性能表现。StampedLock 的状态由版本和模式组成。 获取锁方法返回一个标记,表示和控制与锁状态相关的访问; 这些方法的“尝试”版本可能会返回特殊值 0 来表示获取锁失败。 锁释放和转换方法需要标记作为参数,如果它们与锁的状态不匹配则失败。本文描述 StampedLock 的基础使用场景,入门教程。

Java 锁系列(五)——ReentrantReadWriteLock源码分析

ReentrantReadWriteLock 是读写锁的实现,读锁可以在没有写锁的时候被多个线程同时持有,写锁就是和 ReentrantLock 类似的独占锁,它同样有包含公平锁和不公平锁两种实现方式,在实例化时将同时实例化 ReadLock 和 WriteLock 实例,本文主要聚焦于 WriteLock 的实现分析,因为 ReentrantReadWriteLock 中的部分实现与 ReentrantLock 一样基于 AbstractQueuedSynchronized 的实现,对于一些相同的逻辑本文不再赘述。

Java 锁系列(三)——ReentrantLock源码分析

ReentrantLock 是一个可重入的独占锁,是基于 AQS(AbstractQueuedSynchronized,抽象队列式同步器)实现的,它有公平锁和不公平锁两种实现方式。简单查看源码,可以发现 ReentrantLock 其实是一个代理的模式,Reentranlock 的核心是其内部继承自 AbstractQueuedSynchronized 的抽象类 Sync,将 Sync 作为锁的同步基础,其中加锁/解锁等操作其实都是由 Sync 对象完成的,也是通过实例化 FairSync 或 NonfairSync 分别对应公平锁和非公平锁的实现。

Java 锁系列(二)——ReentrantLock 和 ReentrantReadWriteLock基础运用

Lock 接口提供了与 synchronized 相似的功能,和 synchronized 不同的是,Lock 在使用的时候需要显示的获取和释放锁。虽然牺牲了隐式获取释放锁的便捷性,但是对于锁的操作具有更强的可操作性、可控制性以及提供可中断操作和超时获取锁等机制。本文将描述 ReentrantLock 和 ReadWriteLock 锁的基础使用。

Java 锁系列(一)——锁分类和基础概述

在多线程在获取资源的时候,锁用于保证资源获取的有序性和占用形,可以控制多个线程访问共享资源的顺序。Java提供了种类丰富的锁,每种锁因其特性的不同,在适当的场景下能够展现出非常高的效率。本文旨在对 java 主流的锁进行分类,梳理锁相关的基础知识。