java.util.concurrent.locks.AbstractQueuedSynchronizer作为java并发库的核心构件,结合了多位大师的智慧,作者Doug Lea写道,Thanks xxxx, for helpful ideas, discussions, and critiques on the design of this class.
此类包含两种模式,独占模式和共享模式,处于独占模式下时,其他线程试图获取该锁将无法取得成功。在共享模式下,多个线程获取某个锁可能(但不是一定)会获得成功
独占模式下获取锁的方法为tryAcquire,此方法必须有子类实现,下图为并发库中此方法的具体实现类,可以看到锁ReentrantLock就是采用的独占模式
共享模式下获取锁的方法为tryAcquireShared,此方法同样必须有子类实现,下图为并发库中此方法的具体实现类,可以看到信号灯Semaphore就是采用的共享模式,结合上面可以看见读写锁ReentrantReadWriteLock两者皆用到了
公平性讲的是线程获取锁的方式是粗暴的直接抢占,还是排队获取
独占性讲的是某lock已经被其他线程占据后当前线程是否还可以去占有,比如信号灯当然就会用共享模式占有锁,而且可以看到java.util.concurrent.Semaphore.Sync.nonfairTryAcquireShared(int)实现,并不是只有一个线程可以成功获取锁,还剩余available个线程可以获取锁,而java.util.concurrent.locks.ReentrantLock.Sync.nonfairTryAcquire(int)会由于获取不到lock而被加入waiters且堵塞
分享到:
相关推荐
《Java并发系列之AbstractQueuedSynchronizer源码分析(共享模式)》 AbstractQueuedSynchronizer(AQS)是Java并发编程中一个重要的工具,它是Java并发包`java.util.concurrent.locks`中的核心抽象类,用于构建锁...
【Java并发系列之AbstractQueuedSynchronizer源码分析(独占模式)】 AbstractQueuedSynchronizer(AQS)是Java并发编程中一个重要的工具,它是Java并发包`java.util.concurrent.locks`中的核心抽象类,用于构建锁...
AQS的主要特点是支持独占模式和共享模式的同步实现。在独占模式下,一个线程可以独占访问同步资源,而其他线程将被阻塞。在共享模式下,多个线程可以共享访问同步资源。 AQS提供了多种类型的同步方法,包括不可中断...
- **独占模式**:一次只能有一个线程访问资源。 - **共享模式**:允许多个线程同时访问资源。 - **公平模式**:按照线程请求的顺序分配资源。 - **非公平模式**:可能违反线程请求的顺序,优先处理已等待的线程。 #...
2. **独占模式与共享模式**:AQS支持两种模式:独占模式(如ReentrantLock)和共享模式(如CountDownLatch)。独占模式下,只有一个线程能获取资源;共享模式下,可以有多个线程同时获取资源。 3. **等待队列**:...
- **读写锁模式**:`ReadWriteLock`实现了读多写少的并发策略,允许多个读线程同时访问,写线程独占资源。 - **守护线程模式**:用于服务其他线程,例如垃圾回收线程就是典型的守护线程。 5. **线程安全的集合类*...
共享模式与独占模式类似,但允许多个线程同时获取同步状态。在共享模式下,AQS通过`tryAcquireShared`方法判断线程是否可以获取同步状态。如果可以获取,返回一个正数表示可以获取的状态数;否则返回负数表示失败。 ...
AQS提供了两种基本的同步模式:独占模式和共享模式。独占模式下,只有一个线程可以获取锁,例如`ReentrantLock`;而在共享模式下,多个线程可以同时获取锁,如`CountDownLatch`和`Semaphore`。在独占模式下,`...
AQS的实现主要分为两种模式:独占模式和共享模式。在独占模式下,只有一个线程可以执行,比如ReentrantLock。在共享模式下,多个线程可以同时执行,比如Semaphore、CountDownLatch。AQS通过模板方法的设计模式,将...
AQS支持独占模式和共享模式两种同步操作。在独占模式下,只有一个线程可以成功执行;在共享模式下,则允许多个线程并发执行。AQS通过State变量的值来区分这两种模式,并且提供了不同的方法来实现这两种同步策略。 ...
AQS的acquire方法用于线程以独占模式获取资源,若资源被其他线程占有,则线程会加入到等待队列,并被阻塞。release方法则用于释放资源,它会唤醒队列中等待的下一个线程。 AQS还提供了ConditionObject类,它与AQS...
- acquireSharedInterruptibly共享模式获取锁,如果在获取锁的过程中线程被中断,则直接抛出中断异常 - releaseShared释放锁资源 * 条件队列: - await阻塞等待条件,如果被中断则抛出中断异常 - ...
- **实现**:除了独占和共享模式外,增加了乐观读模式。读锁通过获取一个时间戳来标记,若未发生写操作,读操作无需同步,从而提高性能。 5. **CountDownLatch**: - **设计思想**:用于一次性阻塞一组线程,直到...
3. **核心方法**:AQS提供了几个关键的抽象方法,如`tryAcquire()`和`tryRelease()`用于独占模式的资源获取和释放,以及`tryAcquireShared()`和`tryReleaseShared()`用于共享模式。子类需要根据具体实现重写这些方法...
同步器可以支持独占式和共享式两种获取模式,这使得它能适应不同类型的同步组件需求。 同步队列在AQS中扮演关键角色。当线程无法获取同步状态时,会被构造成节点加入队列并被阻塞。释放同步状态时,首节点的线程会...
`tryAcquire`和`tryRelease`对应独占模式,`tryAcquireShared`和`tryReleaseShared`适用于共享模式。这些方法决定了如何判断线程能否获取资源以及何时释放资源。 在AQS的`acquire`方法中,线程尝试获取资源,如果...
AQS通过一个int类型的state变量来管理锁的状态,这个状态可以是独占模式(exclusive mode)或共享模式(shared mode)。下面将详细介绍AQS的关键概念和方法。 1. **ClassNode**: ClassNode是AQS内部用于表示线程...
对于独占模式,acquire方法会尝试获取资源,如果获取失败,则将当前线程封装成节点加入到同步队列尾部,并阻塞当前线程。当持有锁的线程释放锁时,会唤醒同步队列中的下一个等待线程。共享模式下,acquireShared方法...
本文将详细探讨显式锁的概念,以及AbstractQueuedSynchronizer(AQS)的设计模式与使用方式。 首先,让我们了解什么是显式锁。在Java中,synchronized关键字提供了隐式的锁机制,但其功能相对有限。为了提供更灵活...