首页 > 其他 > 详细

AbstractQueuedSynchronizer实现原理分析——ReentrantLock

时间:2019-01-15 23:55:39      阅读:249      评论:0      收藏:0      [点我收藏+]

在Java并发包java.util.concurrent中可以看到,不少源码是基于AbstractQueuedSynchronizer(以下简写AQS)这个抽象类,因为它是Java并发包的基础工具类,是实现ReentrantLock、CountDownLatch、Semaphore、FutureTask 等类的基础。

AQS的主要使用方式是继承,子类通过继承AQS并实现它的抽象方法来管理同步状态,在抽象方法中免不了要对同步状态进行更改,这时就需要使用AQS提供的3个方法(getState()、setState(int newState)和compareAndSetState(int expect,int update) 来进行操作,因为他们能够保证状态的改变是安全的 。

1 AQS原理介绍

在 AQS 内部,通过维护一个FIFO队列来管理多线程的排队工作。在公平竞争的情况下,无法获取同步状态的线程将会被封装成一个节点,置于队列尾部。入队的线程将会通过自旋的方式获取同步状态,若在有限次的尝试后,仍未获取成功,线程则会被阻塞住。大致示意图如下:

 

技术分享图片技术分享图片
当头结点释放同步状态后,且后继节点对应的线程被阻塞,此时头结点

线程将会去唤醒后继节点线程。后继节点线程恢复运行并获取同步状态后,会将旧的头结点从队列中移除,并将自己设为头结点。大致示意图如下:

技术分享图片

技术分享图片

AbstractQueuedSynchronizer实现原理分析——ReentrantLock

原文:https://www.cnblogs.com/wuchanming/p/10274907.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!