AQS ﹏ヽ暗。殇╰゛Y 2022-11-09 03:55 182阅读 0赞 # 1 # AQS抽象的队列同步器,AQS定义了一套多线程访问共享资源的同步器框架,许多同步类实现都依赖于它,如常用的ReentrantLock/Semaphore/CountDownLatch ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzczNjA4NA_size_16_color_FFFFFF_t_70]首先AQS维护了一个volatile 修饰的state和一个FIFO的同步队列(多线程争用资源被阻塞时会进入此队列),state的作用主要是用来表示当前锁的一个状态。这里volatile是核心关键词,具体volatile的语义,在此不述。state的访问方式有三种: getState() // 获得state setState() //设置state compareAndSetState() //cas自旋设置state AQS定义两种资源共享方式:Exclusive(独占,只有一个线程能执行,如ReentrantLock)和Share(共享,多个线程可同时执行,如Semaphore/CountDownLatch)。 不同的自定义同步器争用共享资源的方式也不同。自定义同步器在实现时只需要实现共享资源state的获取与释放方式即可,至于具体线程等待队列的维护(如获取资源失败入队/唤醒出队等),AQS已经在顶层实现好了。自定义同步器实现时主要实现以下几种方法: isHeldExclusively():该线程是否正在独占资源。只有用到condition才需要去实现它。 tryAcquire(int):独占方式。尝试获取资源,成功则返回true,失败则返回false。 tryRelease(int):独占方式。尝试释放资源,成功则返回true,失败则返回false。 tryAcquireShared(int):共享方式。尝试获取资源。负数表示失败;0表示成功,但没有剩余可用资源;正数表示成功,且有剩余资源。 tryReleaseShared(int):共享方式。尝试释放资源,如果释放后允许唤醒后续等待结点返回true,否则返回false。 **以ReentrantLock举例** 初始为0表示当前是没有线程获得锁的状态,例如当A线程调用lock()时,会调用tryAcquire()来独占该锁并将state+1,此后,其他线程再tryAcquire()时就会失败,直到A线程unlock()到state=0(即释放锁)为止,直到线程调用unlock()释放锁,并且state为0时,其他线程才可以获得该锁,当然锁释放之前A线程是可以继续获得锁的,并且每次重复获得state+1,这就是可重入锁的实现原理,当然A线程释放锁需要释放到state为0为止其他线程才可以获得锁。 **再以CountDownLunch举例** 任务分为N个子线程去执行,state也初始化为N(注意N要与线程个数一致)。这N个子线程是并行执行的,每个子线程执行完后countDown()一次,state会CAS减1。等到所有子线程都执行完后(即state=0),会unpark()主调用线程,然后主调用线程就会从await()函数返回,继续后余动作。 private volatile int state; # 2 # acquire(int) 此方法是独占模式下线程获取共享资源的顶层入口。如果获取到资源,线程直接返回,否则进入等待队列,直到获取到资源为止,且整个过程忽略中断的影响。这也正是lock()的语义,当然不仅仅只限于lock()。获取到资源后,线程就可以去执行其临界区代码了。下面是acquire()的源码: public final void acquire(int arg) { if (!tryAcquire(arg) && acquireQueued(addWaiter(Node.EXCLUSIVE), arg)) selfInterrupt(); } 1. tryAcquire()尝试直接去获取资源,如果成功则直接返回(这里体现了非公平锁,每个线程获取锁时会尝试直接抢占加塞一次,而CLH队列中可能还有别的线程在等待); 2. addWaiter()将该线程加入等待队列的尾部,并标记为独占模式; 3. acquireQueued()使线程阻塞在等待队列中获取资源,一直获取到资源后才返回。如果在整个等待过程中被中断过,则返回true,否则返回false。 4. 如果线程在等待过程中被中断过,它是不响应的。只是获取资源后才再进行自我中断selfInterrupt(),将中断补上。 [学习的博客并引用过来记录一下http://www.cnblogs.com/waterystone/p/4920797.html][http_www.cnblogs.com_waterystone_p_4920797.html] [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzczNjA4NA_size_16_color_FFFFFF_t_70]: /images/20221023/188f46e8a7bc4286a61ca9a5a89883b0.png [http_www.cnblogs.com_waterystone_p_4920797.html]: http://www.cnblogs.com/waterystone/p/4920797.html
相关 AQS详解 前言:之前AQS、ReentrantLock、CountLatchDown大概原理都看懂了,面试的时候一问能说个大概,感觉这样也就行了,跟背课文一样背源码也没什么意思,但是根据 今天药忘吃喽~/ 2022年12月11日 15:29/ 0 赞/ 176 阅读
相关 AQS ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ub 骑猪看日落/ 2022年12月07日 01:53/ 0 赞/ 155 阅读
相关 AQS 1 AQS抽象的队列同步器,AQS定义了一套多线程访问共享资源的同步器框架,许多同步类实现都依赖于它,如常用的ReentrantLock/Semaphore/CountD ﹏ヽ暗。殇╰゛Y/ 2022年11月09日 03:55/ 0 赞/ 183 阅读
相关 AQS简介 AQS简介 > AQS,AbstractQueuedSynchronizer,即队列同步器 > AQS即是AbstractQueuedSynchronizer,一个用 末蓝、/ 2022年05月25日 00:16/ 0 赞/ 184 阅读
相关 aqs学习 aqs是一个很重要的并发框架,熟悉之后可以很方便的构造自己的并发工具。 ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text 「爱情、让人受尽委屈。」/ 2022年04月24日 13:24/ 0 赞/ 181 阅读
相关 AQS AQS 继承AOS(含独占线程) volatile int state 组合使用 可重写tryAcquire tryRelease tryAcquireShared tryR àì夳堔傛蜴生んèń/ 2022年04月14日 03:37/ 0 赞/ 220 阅读
相关 AQS详解 AQS的介绍 AQS的全称为(AbstractQueuedSynchronizer),这个类在java.util.concurrent.locks包下面。 ![在这里插 电玩女神/ 2022年02月28日 11:20/ 0 赞/ 284 阅读
相关 AQS笔记 AQS笔记 概述 AQS 是 `AbstractQueueSynchronized` 抽象同步队列的简称,它是实现同步器的基础组件,并发包中锁的底层就是使 我不是女神ヾ/ 2022年02月21日 15:36/ 0 赞/ 204 阅读
相关 AQS架构 AQS,全称是AbstractQueuedSynchronizer,中文译为抽象队列式同步器 AQS架构: ![watermark_type_ZmFuZ3poZW5 水深无声/ 2021年12月10日 01:07/ 0 赞/ 301 阅读
还没有评论,来说两句吧...