AbstractQueuedSynchronizer之AQS源码解读

AQS:核心方法

acquire(int arg): 进入临界区,失败加入队列,park, unpark之后再次尝试进入临界区
	boolean tryAcquire(int arg); 试图进入临界区;
	Node addWaiter(Node): 将该线程添加至同步队列尾节点(双向链表队列)
		+ 当前线程构建成 新Node节点;
		+ 新Node CAS 至 tail;
		+ (CAS失败) enq(Node);
	Node enq(Node)
		+ 若队列为空,初始化 new Node() 为 head.
		+ for循环直至成功 =>  新Node CAS 至 tail.
	boolean acquireQueued(final Node node, int arg):
		+ for循环:直到当前节点前置节点为Head才可出队列;
			+ 若当前节点的 前继节点是Head,说明当前节点为第一个节点可出队列;
			+ 若不是,则shouldParkAfterFailedAcquire将前一个节点设置为 Node.SIGNAL,进入LockSupport.park(this)
通过上述流程,需注意:
Head节点是空节点;
前置节点的prev.waitStatus表示当前节点的状态(<=0为有效)
LockSupport.park 之前,会从队尾检查移除已取消的节点;
void unparkSuccessor(Node node):从同步队列取出Node,unpark(node.thread)
	+ 取出第一个有效节点,进行unpark节点的thread
	+ 其中若第一个节点不是有效,会将尾节点一直向Head节点查找;

AQS:钩子方法:(临界区维护state 线程同步状态)

boolean tryAcquire(int arg)
需要检查是否符合进入临界区条件
boolean tryRelease(int arg)
恢复临界区条件,使后续线程可进入临界区
int tryAcquireShared(int arg)
同tryAcquire(int arg)语义,返回值是int
boolean tryReleaseShared(int arg)
同tryRelease(int arg) 语义

AQS:工具方法

  • 进入临界区
    acquire(int arg)
    acquireInterruptibly(int arg)
    acquireShared(int arg)
    acquireSharedInterruptibly(int arg)
    tryAcquireNanos(int arg, long nanosTimeout)
    tryAcquireSharedNanos(int arg, long nanosTimeout)

  • 退出临界区
    release(int arg)
    releaseShared(int arg)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值