目录
AQS(Abstract Queued Synchronizer 抽象同步队列)原理
JUC
1、什么是JUC?
包名的缩写JUC
2、为什么出现JUC
为java语言提供多线程同步结构的支撑
3、解决了什么问题
解决多线程同步问题,给java开发者提供了便利的函数、功能和结构
4、包含哪些内容
原子类、锁类和工具类(线程同步结构、线程池等等)
如何自己实现一把锁
1、如何表示锁状态:有锁?无锁?
boolean state; //true 有锁,false无锁。只能表示两种状态
为了实现锁重入,要记录锁重入的次数:int times;
=>两个变量有点冗余,直接用int state表示锁状态和重入次数
0无锁,大于零表示锁重入次数 提示:1为重入一次,也即只加锁一次
2、如何保证多线程抢锁线程安全?
CAS
3、如何处理获取不到锁的线程
自旋 阻塞 自旋+阻塞
4、如何释放锁
自旋:自己抢锁
阻塞:唤醒
自旋锁:线程不停的执行某段代码,直到条件满足或次数达到限制
缺点:占用CPU不干事,导致性能障碍,占着茅坑不拉屎
优点:适用于执行操作较少切快的操作,自旋马上就能获得锁,这样的话就不会太消耗CPU资源
阻塞:达不到条件,告诉操作系统,把我阻塞
AQS(Abstract Queued Synchronizer 抽象同步队列)原理
Abstract:因为它不知道怎么上锁。模板方法模式即可暴露出上锁逻辑
Queue:线程阻塞队列
Synchronizer:同步
CAS+state:完成多线程抢锁逻辑
Queue 完成抢不到锁的排队