AQS原理

当我们在进行开发工作的过程中,线程上的问题存在疑问去看网上找答案时,文章中都会出现AQS这个关键词,那么AQS是什么?

1.什么是AQS

AQS全称是AbstractQueuedSynchronizer,是阻塞式锁和相关同步器工具的框架

  • 存在的的特点有
    • 使用state属性来表示资源的状态(独享,还是共享模式),子类需要定义如何维护这个状态,控制如果获取锁和释放锁
      getState - 获取state状态
      setState - 设置state状态
      compareAndSetState - cas 机制设置state状态
      在这里插入图片描述

独占模式是只有一个线程能够访问资源,而共享模式可以允许多个线程访问资源
例如:独占ReenTrantLock 共享Semaphore、CountdownLatch、CycliBarrier等

2.AQS使用

AQS经常用来实现各种同步器,而各种同步器的核心就是对state的操作
实现不可重入锁

  1. 自定义一个同步器

3.AQS基本思想

AQS的基本思想其实就是对state进行操作
获取锁的逻辑

while(state状态是不能被获取的){
	if(阻塞队列中还没有此线程){
		入队阻塞
	}
}
当前线程出队

释放锁的逻辑

if(state 状态允许了){
	if(得到 state){
		线程启动
	}else{
		回到阻塞队列
	}
}

要点

  • 原子维护state状态
  • 阻塞及恢复线程
  • 维护队列

4.state设计

  • state使用volatile配合cas保证其修改时的原子性
  • state使用了32位的int来维护同步的状态

5.阻塞恢复设计

  • 早期的控制县城暂停和恢复的api有suspend和resume,但是他们是不可用的,因为他两个有先后顺序,先使用resume的话suspend是不能感知到的
  • 现在我们一般采用的是park和unpark来实现线程的暂停和恢复,对于park和unpark来说没有先后顺序,先unpark对park没有影响
  • park和unpark是针对线程的,不是针对监视器mointor的,对线程更为友好
  • park住的线程可以被interrupt打断就像打断正在run的线程一样

6.队列设计

在这里插入图片描述
以上就是本文的全部内容

对于其具体的实现有很多,例如常用的ReentrantLock,可以通过作者的另一篇文章来进行了解
ReentrantLock原理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值