【理解向】对于synchronized,CAS,AQS的基础认识模型
文章目录
- 前言
- 一、提供给JAVA使用的锁的实现
- 1.synchronized
- (1)实现原理
- (2)优缺点
- 2.CAS Unsafe
- (1)实现原理
- (2)优缺点
- 二、JAVA中的锁工具的一些实现(synchronized/juc)
- 1.synchronized
- (1)特点
- 2.AQS
- (1)AQS中实现线程阻塞
- (2)特点
- 3.Reentrantlock
- (2)特点
- 4.CountDownLatch
前言
本文写作目标 是对于锁知识不太熟悉,概念太多从而无法梳理的读者,提供一种对于JAVA中锁知识搭建的认识模型,同时作为笔者笔记记录.如有错误还请指正.
一、提供给JAVA使用的锁的实现
1.synchronized
(1)实现原理
JAVA中的多线程,实际上是对操作系统的多线程的一种映射,也就是说,JAVA中的每一条线程都是操作系统中的每一条线程
synchronized底层由C++语言的Monitor(监视者)实现,而C++语言的Monitor是针对于操作系统的操作,所以synchronized的底层是属于操作系统级别的操作 也就是操作系统命令实现
(2)优缺点
优:基于操作系统,安全,同步
缺:基于操作系统,线程间的切换需要操作系统内核态与用户态之间切换,效率低
2.CAS Unsafe
(1)实现原理
为了针对synchronized的不足进行改进,同时尽量满足线程安全的需求,产出的新型解决方案
CAS的思想简单来说 当线程修改一个目标值时候,会对比目标值是否符合该线程对于该值修改前的预期,如果满足就修改,如果不满足,则放弃(Unsafe默认修改不成功会默认自旋10次)
聪明的小伙伴应该一下就发现CAS思想中的两个问题:
1,线程获取并对比目标值的时候,能够确认该目标值此时是正确的吗?(可见性问题)
2,线程在比较并修改目标值的时候,能够确认不会有其他线程正在执行该步骤嘛?(原子性问题)
满足原子性:每一个操作都是最小不可分割单位,不会被别的线程操作影响
满足可见性:每次访问都是访问主存中,而不是直接内存
X86架构下CPU指令cmpxchg支持原子性CAS操作,也解决了可见性的问题
也就是说 基于CPU提供的支持 导致我们上层JAVA语言可以简单的对于CAS思想的实现
(2)优缺点
优:效率高
缺:编码风险大,不安全
二、JAVA中的锁工具的一些实现(synchronized/juc)
1.synchronized
同步代码块,这里主要介绍配合使用的一些方法,以及JAVA6之后做的一些优化
(1)特点
互斥锁,悲观锁,可重入
2.AQS
AbstractQueuedSynchronizer 抽象队列同步器
AQS提供了一种同步管理框架,利用了CAS思想,提供了等待队列,并且与业务解耦.提供了线程安全编程的解决方案
(1)AQS中实现线程阻塞
使用LockSupport提供的unpark(),park()方法(底层使用的Unsafe)
(2)特点
提供了独占锁,共享锁的实现方法
提供了重入锁的实现方法
3.Reentrantlock
reentrantLock基于AQS,是AQS的一个比较代表性的排它锁实现
(2)特点
提供了公平锁,非公平锁的实现
利用AQS status参数实现可重入,独占锁
4.CountDownLatch
CountDownLatch也基于AQS,是AQS的一个比较代表性的共享锁实现,作为JAVA多线程编程的工具使用