抽象队列同步器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
节点的生命状态:信号量
详见下一章。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)