多线程之AQS初识

多线程之AQS初识,第1张

线程之AQS初识

抽象队列同步器AQS(AbstractQueuedSynchronizer):
AQS具备特性:
阻塞等待队列
共享/独占
公平/非公平
可重入
允许中断

ReentrantLock:
是基于AQS实现的:互斥,支持公平性
ReentrantLock lock = new ReentrantLock(false);//false为非公平锁,true为公平锁,不传参默认非公平锁
如何实现公平与非公平性?
在ReentrantLock内部定义了一个Sync内部类,该类继承了AbstractQueuedSynchronized,对该抽象类的部分方法做了实现,并且还定义了两个子类
1.fairSync    公平锁的实现
2.NonfairSync 非公平锁的实现
这两个类都继承了Sync,也就是间接继承了AbstractQueuedSynchronized,所以ReentrantLock同时具备公平性和非公平性
涉及的设计模式:模板模式--->子类根据需要做具体业务实现
实现原理分析:
lock.lock();//加锁
自旋,判断是否加锁成功
LockSupport.park();===>阻塞线程
lock.unlock();//解锁
LockSupport.unpark(要唤醒的线程);===>唤醒park()阻塞的线程
锁的实现核心:
自旋,LockSupport,CAS(比较与交换==>原子 *** 作,依赖汇编语言指令:cmpxchg()),队列

AbstractQueuedSynchronizer几个重要参数:
exclusiveOwnerThread:记录当前获取锁的线程
state:状态器
公平锁:
同步等待队列(CLH):双向链表结构,FIFO先进先出

tryAcquire(arg);//锁竞争逻辑
addWaiter(Node.EXCLUSIVE);//线程入队,Node节点,对thread的引用
创建节点:几个重要属性:pre,next,thread,waitStatus
节点的生命状态:信号量

详见下一章。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/zaji/5697011.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存