码迷,mamicode.com
首页 > 其他好文 > 详细

AbstractQueuedSynchronizer实现原理分析——ReentrantLock

时间:2019-01-16 00:19:24      阅读:182      评论:0      收藏:0      [点我收藏+]

标签:jpg   阻塞   状态   int   技术   java   com   gets   image   

在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

标签:jpg   阻塞   状态   int   技术   java   com   gets   image   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!