AQS 与 LockSupport

1.结构

Lock的实现类其实都是构建在AbstractQueuedSynchronizer上,每个Lock实现类都持有自己内部类Sync的实例

二。LockSupport

This class associates, with each thread that uses it, a permit (in the sense of the Semaphore class). A call to park will return immediately

if the permit is available, consuming it in the process; otherwise it may block. A call to unpark makes the permit available, if it was not

already available. (Unlike with Semaphores though, permits do not accumulate. There is at most one.)

此类以及每个使用它的线程与一个permit关联(从 Semaphore 类的意义上说)。如果该许可可用,并且可在进程中使用,则调用 park 将立即返回;否则可能 阻塞。

如果许可尚不可用,则可以调用 unpark 使其可用。(与 Semaphore 不同的是,permit不能累积,并且最多只能有一个)

1.park

public static void park()

Disables the current thread for thread scheduling purposes unless the permit is available.

If the permit is available then it is consumed and the call returns immediately; otherwise the current thread becomes disabled for thread

scheduling purposes and lies dormant until one of three things happens:

1.Some other thread invokes unpark with the current thread as the target

2.Some other thread interrupts the current thread

3.The call spuriously (that is, for no reason) returns

This method does not report which of these caused the method to return. Callers should re-check the conditions which caused the thread

to park in the first place. Callers may also determine, for example, the interrupt status of the thread upon return.

时间: 2024-08-02 10:03:11

AQS 与 LockSupport的相关文章

高效并发JUC锁-永恒砖石

JUC包的锁(可重入锁和读写锁) Lock是JAVA5增加的内容,在JUC(java.util.concurrent.locks)包下面,作者是并发大师Doug Lea.JUC包提供了很多封装的锁,包括常用的ReentrantLock和ReadWriteLock.这些所其实都是依赖java.util.concurrent.AbstractQueuedSynchronizer(AQS)这个类来实现的,这个类有个简写的名字叫AQS,对这就是著名的AQS. 关于Lock,先说说线程获取Lock锁的时候

【Java并发编程实战】—– AQS(三):阻塞、唤醒:LockSupport

在上篇博客([Java并发编程实战]-– AQS(二):获取锁.释放锁)中提到,当一个线程加入到CLH队列中时,如果不是头节点是需要判断该节点是否需要挂起:在释放锁后,需要唤醒该线程的继任节点 lock方法,在调用acquireQueued(): if (shouldParkAfterFailedAcquire(p, node) && parkAndCheckInterrupt()) interrupted = true; 在acquireQueued()中调用parkAndCheckIn

Java并发编程原理 - Unsafe && LockSupport类及AQS同步器的设计

[相关源码] (https://github.com/Wasabi1234/Java-Concurrency-Progamming-Tutorial) 1 Unsafe类的park和unpark public native void park(boolean var1, long var2); public native void unpark(Object var1); park方法用来阻塞一个线程,第一个参数用来指示后面的参数是绝对时间还是相对时间,true表示绝对时间,false表示从此刻

Java并发框架——AQS阻塞队列管理(三)——CLH锁改造

在CLH锁核心思想的影响下,Java并发包的基础框架AQS以CLH锁作为基础而设计,其中主要是考虑到CLH锁更容易实现取消与超时功能.比起原来的CLH锁已经做了很大的改造,主要从两方面进行了改造:节点的结构与节点等待机制.在结构上引入了头结点和尾节点,他们分别指向队列的头和尾,尝试获取锁.入队列.释放锁等实现都与头尾节点相关,并且每个节点都引入前驱节点和后后续节点的引用:在等待机制上由原来的自旋改成阻塞唤醒.如图2-5-9-4,通过前驱后续节点的引用一节节连接起来形成一个链表队列,对于头尾节点的

深入浅出 Java Concurrency 锁机制 : AQS

转载:http://www.blogjava.net/xylz/archive/2010/07/06/325390.html 在理解J.U.C原理以及锁机制之前,我们来介绍J.U.C框架最核心也是最复杂的一个基础类:java.util.concurrent.locks.AbstractQueuedSynchronizer. AQS AbstractQueuedSynchronizer,简称AQS,是J.U.C最复杂的一个类,导致绝大多数讲解并发原理或者实战的时候都不会提到此类.但是虚心的作者愿意

AbstractQueuedSynchronizer AQS框架源码剖析

目录 1.引子 2.AQS架构设计原理 3.AQS源码实现 4.简单应用 5.总结 ====正文分割线============ 一.引子 Doug Lea在JSR166中建立了一个小框架,AbstractQueuedSynchronizer同步器框架(AQS).这个框架为构造同步器提供一种通用的机制,并且被j.u.c包中大部分类使用. 包结构如下图,其中AbstractOwnableSynchronizer是其父类,而AbstractQueuedLongSynchronizer是其32位状态的升

扒一扒ReentrantLock以及AQS实现原理

提到JAVA加锁,我们通常会想到synchronized关键字或者是Java Concurrent Util(后面简称JCU)包下面的Lock,今天就来扒一扒Lock是如何实现的,比如我们可以先提出一些问题:当我们通实例化一个ReentrantLock并且调用它的lock或unlock的时候,这其中发生了什么?如果多个线程同时对同一个锁实例进行lock或unlcok操作,这其中又发生了什么? AQS ReentrantLock 羊群效应 摘要 提到JAVA加锁,我们通常会想到synchroniz

Java并发包源码学习之AQS框架(二)CLH lock queue和自旋锁

上一篇文章提到AQS是基于CLH lock queue,那么什么是CLH lock queue,说复杂很复杂说简单也简单, 所谓大道至简: CLH lock queue其实就是一个FIFO的队列,队列中的每个结点(线程)只要等待其前继释放锁就可以了. AbstractQueuedSynchronizer是通过一个内部类Node来实现CLH lock queue的一个变种,但基本原理是类似的. 在介绍Node类之前,我们来介绍下Spin Lock,通常就是用CLH lock queue来实现自旋锁

JUC回顾之-AQS同步器的实现原理

1.什么是AQS? AQS的核心思想是基于volatile int state这样的volatile变量,配合Unsafe工具对其原子性的操作来实现对当前锁状态进行修改.同步器内部依赖一个FIFO的双向队列来完成资源获取线程的排队工作. 2.同步器的应用 同步器主要使用方式是继承,子类通过继承同步器并实现它的抽象方法来管理同步状态,对同步状态的修改或者访问主要通过同步器提供的3个方法: getState() 获取当前的同步状态 setState(int newState) 设置当前同步状态 co