并发编程-AbstractQueuedSynchronizer原理图解
2021-10-18 19:46:01 11 举报
AbstractQueuedSynchronizer(简称AQS)是Java并发编程中一个非常核心的类,它通过内置的一个FIFO队列来完成线程间的同步。AQS的核心组件包括:state、等待队列、独占模式获取锁和共享模式获取锁。其中,state用于表示同步状态,等待队列用于存放等待获取锁的线程,独占模式获取锁和共享模式获取锁则用于实现线程间的同步。当线程尝试获取锁时,如果锁已被其他线程占用,则该线程会被放入等待队列中等待;当锁被释放时,AQS会从等待队列中唤醒一个线程来获取锁。通过这种方式,AQS实现了线程间的高效同步。
作者其他创作
大纲/内容
tail
LockSuport.park
等待队列
ThreadA
LockSuport.unpark
Check
存在多个线程并发修改state的值的问题
state=0如果state=1表示有锁state=0表示无锁
exclusiveOwnerThread=ThreadA->null
第一个问题: 如何实现互斥?
wait
head
阻塞
双向链表
ThreadC
notify
第三个问题:如何实现线程的阻塞和唤醒
state=1->0
AbstractQueuedSynchronizer
ThreadB
唤醒处于等待状态下的线程
假设ThreadB/C不去阻塞,那么将不断的运行lock方法尝试抢占锁
lock()
互斥变量
unlock
condition.signal()
第二个问题: 用什么样的数据结构来保存处于等待状态下的线程还得考虑公平性和非公平性
addWaiter
condition.await()
true/false:CAS(CompareAndSet)
更多资料,请关注微信公众号
共享资源
没有获得锁的线程的处理方式
0 条评论
下一页