一、AbstractQueuedSynchronizer就不多说了,Lock就是基于它来实现锁的功能的,而AbstractQueuedSynchronizer底层则是通过cas操作来实现。
通过AbstractQueuedSynchronizer来实现共享锁其实很简单,只需要对AbstractQueuedSynchronizer的状态进行控制就行了,其他的AbstractQueuedSynchronizer都做好了封装,举个例子吧。
package com.pinnet.test; import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.AbstractQueuedSynchronizer; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; public class ShareLock implements Lock { private Syn sync = new Syn(5); /** * 在同步装置内部实现一个AbstractQueuedSynchronizer的子类 * */ private static final class Syn extends AbstractQueuedSynchronizer { private static final long serialVersionUID = 5854536238831876527L; //构造方法,同时进入的线程数量必须为整数 Syn(int count) { if (count <= 0) { throw new IllegalArgumentException("count must large than zero."); } //设置AQS的状态为count setState(count); } /** * 加锁的时候会调用此方法,redececount参数为改变的状态数量,一般传1即可 */ public int tryAcquireShared(int reduceCount) { //加锁和释放的方法都必须要放在循环中,避免失败的操作 for (;;) { //获取当前的状态 int current = getState(); //计算过后的状态 int newCount = current - reduceCount; //如果新的状态小于0 则返回值,在AQS的doAcquireShared方法中,如果返回的值小于0,则会将该线程封装为node放入队列 //如果大于0 表示该线程能执行则线程会继续执行不受影响 if (newCount < 0 || compareAndSetState(current, newCount)) { return newCount; } } } public boolean tryReleaseShared(int retrunCount) { for (;;) { int current = getState(); int newCount = current + retrunCount; if (compareAndSetState(current, newCount)) { return true; } } } } public void lock(){ sync.acquireShared(1); } public void lockInterruptibly() throws InterruptedException{ sync.acquireSharedInterruptibly(1); } public boolean tryLock(){ return sync.tryAcquireShared(1)>=0; } public boolean tryLock(long time, TimeUnit unit) throws InterruptedException { return sync.tryAcquireSharedNanos(1, unit.toNanos(time)); } public void unlock(){ sync.releaseShared(1); } public Condition newCondition(){ return null; } }
注释很清楚,具体的可以看AbstractQueuedSynchronizer实现,其实都是很简单地
相关推荐
1. 锁的原理:ReentrantLock 锁是基于 AQS(AbstractQueuedSynchronizer)机制来实现的。 2. 锁的分类:ReentrantLock 锁可以分为公平锁和非公平锁两种。 3. 公平锁:公平锁是 ReentrantLock 锁的一种实现方式,确保...
一、AQS(AbstractQueuedSynchronizer)基础同步器的设计与实现 AQS是Java并发包中用于构建锁和同步组件的核心抽象类,它基于一种FIFO(先进先出)的等待队列机制。AQS维护了一个int类型的state字段,用于表示资源的...
而在共享模式下,多个线程可以同时获取资源,允许多个线程共享锁。AQS的典型应用如CountDownLatch、Semaphore等就是基于共享模式实现的。 在共享模式下,获取锁有三种方式,与独占模式类似,包括不响应线程中断获取...
本文将深入探讨这些机制的底层实现,特别是通过`AbstractQueuedSynchronizer`(AQS)来理解`ReentrantLock`和`CountDownLatch`的工作原理。 首先,`ReentrantLock`是一个可重入互斥锁,允许同一个线程多次获取锁,...
AQS通过维护一个共享的、可同步的状态(`state`)来实现锁和其他同步原语。它提供了一个基础框架,使得子类能够定义如何根据状态来管理线程的等待和唤醒。 **2. AQS的“密码锁”——同步状态** AQS的核心是`state`...
其设计思想是利用一个整型变量来表示同步状态,通过原子操作(CAS)来保证线程安全地修改这个状态,从而实现锁和其他同步组件的底层支持。通过学习AQS,开发者可以更好地理解和使用Java并发库中的高级同步工具,如...
ReentrantLock 的实现原理基于 AQS(AbstractQueuedSynchronizer),是一个重入锁,允许一个线程反复地获取锁而不会出现自己阻塞自己的情况。 ReentrantLock 的构造方法可以指定锁的类型,包括公平锁和非公平锁。...
开发者可以通过继承AQS来实现自己的同步器,例如实现一个互斥锁、读写锁、信号量等。 AQS的实现原理是基于队列的数据结构,每个线程都可以被看作是一个节点,节点之间可以形成队列。AQS通过对队列的操作来实现同步...
它提供了一套完整的机制来实现独占锁、共享锁等功能。AQS的核心在于维护了一个volatile int类型的state变量,并提供了getState()、setState()、compareAndSetState()三个方法来操作这个state变量。 ### 二、AQS原理...
其中,AbstractQueuedSynchronizer (AQS) 是Lock实现的核心组件,它为锁和其他同步构建块提供了基础框架。AQS是一个抽象类,它使用一个整型的`state`字段来表示资源的状态,并维护了一个FIFO(先进先出)的等待队列...
在 Java 中,锁有多种不同的实现机制,如可重入锁、读写锁、互斥锁、悲观锁、乐观锁、公平锁、锁消除、独享锁、共享锁等。 可重入锁 可重入锁,也叫做递归锁,指的是同一线程外层函数获得锁之后,内层递归函数仍然...
其中,ReentrantLock是基于AbstractQueuedSynchronizer(AQS)实现的,AQS是一个用来构建锁和其他同步器的框架,它利用一个int成员变量表示状态,并通过内置的FIFO队列来管理线程的排队工作。 sun.misc.Unsafe是...
读锁通过获取一个时间戳来标记,若未发生写操作,读操作无需同步,从而提高性能。 5. **CountDownLatch**: - **设计思想**:用于一次性阻塞一组线程,直到某个事件完成,然后所有线程可以继续执行。 - **实现**...
2. 共享锁:允许多个线程同时持有,如ReentrantReadWriteLock的ReadLock、CyclicBarrier、CountDownLatch和Semaphore。 在实际使用中,例如ReentrantLock的lock()方法,实际上是调用acquire()来尝试独占式获取锁。...
可重入锁通过内部的计数器实现,每当一个线程获取锁时,计数器加1,释放锁时减1。当计数器为0时,表明所有锁都已经释放。 7. **公平锁与非公平锁**: - **公平锁**:线程按照申请锁的顺序获取,遵循先来后到原则...
同步锁是Java 1.0就引入的原生锁机制,主要通过`synchronized`关键字实现。它的核心原则是互斥性,即同一时间只有一个线程能持有同步锁并执行相应的代码块。同步锁有两种形式:方法同步和代码块同步。同步锁的实现...
比如Lock接口及其实现ReentrantLock,提供了比synchronized更灵活的锁机制,同时AQS(AbstractQueuedSynchronizer)是实现各种锁的基础同步器,它管理着一系列的等待线程,并提供一种框架来实现独占锁和共享锁。...
在具体实践中,AQS常用于实现独占锁和共享锁,如ReentrantLock。ReentrantLock提供了公平锁和非公平锁两种模式,公平锁保证了等待最久的线程优先获得锁,而非公平锁则更注重性能,可能让等待时间短的线程优先获取。...
基于JDK层面的锁主要可以分为四种方式,其中AbstractQueuedSynchronizer(AQS)是Java SDK并发包中主要的同步器实现。 AQS是Java中解决同步和互斥问题的基础同步器,通过Lock和Condition两个接口来实现管程。Lock...