ReentrantLock有以下几个特性。基本的获取锁操作,基本的释放锁操作,可轮询的锁获取操作,可中断的获取锁操作,定时获取锁操作,使用公平队列。
首先ReentrantLock的实现主要是依赖于AbstractQueuedSynchronizer。AbstractQueuedSynchronizer它维护一个状态信息单一的整数state。state在此用来表示拥有锁的线程请求获取锁的次数。state==0表示锁为可获取状态。
基本的获取锁操作:lock()方法:
public void lock() {
sync.lock();
}
sync为ReentrantLock静态内部类Sync的一个引用。
无参数的构造函数默认sync指向一个NonfairSync().(不公平队列)。Sync扩展了AbstractQueuedSynchronizer.而NonfairSync扩展了Sync.
NonfairSync中lock()方法的实现如下:
final void lock() {
if (compareAndSetState(0, 1))//AbstractQueuedSynchronizer的方法(原子操作),如果当前的state的值为0则把state的值设为1
setExclusiveOwnerThread(Thread.currentThread());//设置当前锁的有占有者为当前线程
else
acquire(1);//如果是拥有锁的线程请求state++,否则当前线程阻塞,并且把线程存储到阻塞队列中。(AbstractQueuedSynchronizer中使用链表来维护的线程阻塞队列)
}
可轮询的锁获取操作:具体的实现为:
final boolean nonfairTryAcquire(int acquires) {//此处acquirs为1
final Thread current = Thread.currentThread();
int c = getState();
if (c == 0) {//如果state为0证明锁可获取
if (compareAndSetState(0, acquires)) {//原子操作,如果当前的state为0,则把state的值设置为1.
setExclusiveOwnerThread(current);//设置当前锁的占有者为当前线程
return true;
}
}
else if (current == getExclusiveOwnerThread()) {//如果当前锁的占有者为当前线程
int nextc = c + acquires;
if (nextc < 0) // overflow
throw new Error("Maximum lock count exceeded");
setState(nextc);//设置state为占有锁线程请求锁的次数
return true;
}
return false;
}
基本的释放锁操作:
protected final boolean tryRelease(int releases) {//此处releases值为1
int c = getState() - releases;
if (Thread.currentThread() != getExclusiveOwnerThread()) // 非占有线程者调用,抛出异常
throw new IllegalMonitorStateException();
boolean free = false;
if (c == 0) {//锁为可获取状态
free = true;
setExclusiveOwnerThread(null);//锁占有者为空
}
setState(c);
return free;
}
使用公平队列:公平队列的获取锁操作和非公平队列获取锁操作的主要区别在于多了一个判断isFirst(current)判断当前的线程是否是阻塞队列中第一个元素。以此来实现公平队列。
protected final boolean tryAcquire(int acquires) {
final Thread current = Thread.currentThread();
int c = getState();
if (c == 0) {
if (isFirst(current) && //与非公平队列的主要不同点
compareAndSetState(0, acquires)) {
setExclusiveOwnerThread(current);
return true;
}
}
else if (current == getExclusiveOwnerThread()) {
int nextc = c + acquires;
if (nextc < 0)
throw new Error("Maximum lock count exceeded");
setState(nextc);
return true;
}
return false;
}
ReentrantLock的实现主要依赖于AbstractQueueSynchronizer,但是ReentrantLock不是扩展AQS而是使用委托,使用静态内部类。这样有个好处在于保持类的整洁性,只暴露需要对外公开的方法。如果扩展AQS的话就会暴露过多的方法,调用者容易误调用这些方法。
分享到:
相关推荐
ReentrantReadWriteLock是读写锁,允许多个读线程同时访问,但写线程独占资源,提高了并发性能。 7. 线程池:Java提供了ExecutorService和ThreadPoolExecutor等工具来管理线程池,线程池可以有效控制运行的线程数量...
AQS的源码阅读笔记详细介绍了ReentrantLock的实现机制,包括锁的释放和加锁过程、公平锁和非公平锁的实现、队列的管理机制等。通过阅读这些代码,可以更好地理解Java并发编程的机制和实现原理。
在"基于java的开发源码-多线程反射泛型及正则表达式学习笔记和源码.zip"这个压缩包中,包含了三个关键的Java编程概念:多线程、反射和泛型,以及正则表达式。下面我们将详细探讨这些知识点。 1. **多线程**:多线程...
09-深入理解AQS之独占锁ReentrantLock源码分析-fox 10-深入理解AQS之Semaphorer&CountDownLatch&CyclicBarrie详解-fox 11-深入理解AQS之CyclicBarrier&ReentrantReadWriteLock详解-fox 12-深入理解AQS之...
通过这份源码笔记,我们可以深入探讨Java线程的内部机制,包括线程的创建、调度、同步和通信等方面的知识。 首先,让我们从Java中的`Thread`类开始。`Thread`是Java线程的基础,它继承自`Object`并实现了`Runnable`...
在深入学习 Java 并发编程时,还需要关注线程安全、锁机制(如 synchronized 关键字、ReentrantLock 等)、并发容器(如 ConcurrentHashMap、ConcurrentLinkedQueue 等)、原子变量(AtomicInteger、AtomicReference...
4-5 深入剖析ReentrantLock源码之非公平锁的实现.mp4 4-6 深入剖析ReentrantLock源码之公平锁的实现.mp4 4-7 掌控线程执行顺序之多线程debug.mp4 4-8 读写锁特性及ReentrantReadWriteLock的使用.mp4 4-9 源码...
4-5 深入剖析ReentrantLock源码之非公平锁的实现.mp4 4-6 深入剖析ReentrantLock源码之公平锁的实现.mp4 4-7 掌控线程执行顺序之多线程debug.mp4 4-8 读写锁特性及ReentrantReadWriteLock的使用.mp4 4-9 源码...
4-5 深入剖析ReentrantLock源码之非公平锁的实现.mp4 4-6 深入剖析ReentrantLock源码之公平锁的实现.mp4 4-7 掌控线程执行顺序之多线程debug.mp4 4-8 读写锁特性及ReentrantReadWriteLock的使用.mp4 4-9 源码...
4-5 深入剖析ReentrantLock源码之非公平锁的实现.mp4 4-6 深入剖析ReentrantLock源码之公平锁的实现.mp4 4-7 掌控线程执行顺序之多线程debug.mp4 4-8 读写锁特性及ReentrantReadWriteLock的使用.mp4 4-9 源码...
4-5 深入剖析ReentrantLock源码之非公平锁的实现.mp4 4-6 深入剖析ReentrantLock源码之公平锁的实现.mp4 4-7 掌控线程执行顺序之多线程debug.mp4 4-8 读写锁特性及ReentrantReadWriteLock的使用.mp4 4-9 源码...
Java核心面试笔记主要涵盖了一系列深度话题,旨在帮助具备一定编程基础,尤其是工作3-5年的研发人员提升对Java和Spring框架的理解。以下是其中的关键知识点详解: 1. **Java基础**: - **集合与数组**:Java集合...
Java提供了synchronized关键字、wait()、notify()和notifyAll()方法,以及Lock接口(如ReentrantLock)等同步工具。这些在源码中会被具体应用,帮助理解它们在解决并发问题时的作用。 三、并发集合 Java并发集合...
ReentrantLock 源码 Condition 源码 ConcurrentHashMap 源码 Java 线程状态 JAVA 数据结构 Queue HashMap HashTable ConcurrentHashMap JAVA IO Go Redis Redis Cluster Redis 持久化方式 Redis
Java并发包源码分析(JDK1.8):囊括了java.util.concurrent包中大部分类的源码分析,其中涉及automic包,locks包(AbstractQueuedSynchronizer、ReentrantLock、ReentrantReadWriteLock、LockSupport等),queue...
### Java分布式应用学习笔记06浅谈并发加锁机制分析 #### 1. 前言 在深入探讨Java中的并发加锁机制之前,我们有必要回顾一下多线程环境下的一些基本概念和技术。之前的多线程调度、并发调度以及线程加锁安全等内容...
这篇学习笔记将深入探讨Java多线程的核心概念、实现方式以及相关工具的使用。 一、多线程基础 1. 线程与进程:在操作系统中,进程是资源分配的基本单位,而线程是程序执行的基本单位。每个进程至少有一个主线程,...
9. **源码分析**:阅读和理解JDK中Thread类和其他相关类的源码,有助于深入理解线程的工作原理,例如线程调度、中断机制等。 10. **性能优化**:合理设计线程数量、避免过度竞争、合理使用同步机制等,都是提升多...
集合源码分析 [TOC] 0. 项目构建 0.1 版本控制 0.1.1 Git 0.2 项目管理 0.2.1 Maven 0.2.2 Gradle 1.:hot_beverage: Java 1.1 Java基础 1.1.1 算法与数据结构 字符串KMP算法 BitSet解决数据重复和是否存在等问题 ...