上一篇 <<<Java基础-对象布局
下一篇 >>>Condition
AQS(AbstractQueuedSynchronizer同步器):它提供了一个FIFO队列,是用来构建锁或者其他同步组件的基础框架。
AQS是一个抽象类,主要是通过继承的方式来使用,它本身没有实现任何的同步接口,仅仅是定义了同步状态的获取以及释放的方法来提供自定义的同步组件。
常用框架
底层实现原理
执行流程图
Condition 单向链表,调用await释放锁,当前线程阻塞。
AQS为什么头结点是为空的
模拟AQS的底层写法(LockSupport+CAS的结合实现)核心代码
/**
* 获取锁
*/
public void lock() {
//e=0,n=1 v=0
// 底层使用cas 修改锁的状态从0变为1 硬件层面帮助我们实现
if (acquire()) {
return;
}
// 使用cas 修改锁的状态失败 设计重试次数
Thread currentThread = Thread.currentThread();
// 如果该线程已经存在的情况下
waitThreads.add(currentThread);
for (; ; ) {
//短暂重试
if (acquire()) {
// 移除队列
waitThreads.push(currentThread);
return;
}
// 重试一次还是没有获取到锁,将当前的这个线程变为阻塞状态
LockSupport.park();
}
}
/**
* 释放锁
*/
public void unLock() {
if (exclusiveOwnerThread != Thread.currentThread()) {
throw new RuntimeException("不是当前线程在释放锁");
}
// 释放锁
if (compareAndSetState(1, 0)) {
this.exclusiveOwnerThread = null;
// 取出阻塞的线程 唤醒
Thread pollThread = waitThreads.poll();
if (pollThread != null)
// 唤醒刚才阻塞的线程
LockSupport.unpark(pollThread);
}
}
相关文章链接:
<<<多线程基础
<<<线程安全与解决方案
<<<锁的深入化
<<<锁的优化
<<<Java内存模型(JMM)
<<<Volatile解决JMM的可见性问题
<<<Volatile的伪共享和重排序
<<<CAS无锁模式及ABA问题
<<<Synchronized锁
<<<Lock锁
<<<Condition
<<<CountDownLatch同步计数器
<<<Semaphore信号量
<<<CyclicBarrier屏障
<<<线程池
<<<并发队列
<<<Callable与Future模式
<<<Fork/Join框架
<<<Threadlocal
<<<Disruptor框架
<<<如何优化多线程总结