[toc]
提几个问题:
- synchronized保证原子性,volatile保证可见性;
- 不用volatile,只用synchronized修饰,能保证可见性吗?
## 队列同步器AQS
队列同步器AbstractQueuedSynchronizer(以下简称同步器),是用来构建锁或者其他同步组件的基础框架。
使用同步器提供的3个方法(getState()、setState(int newState)和compareAndSetState(int expect,int update))来进行操作,因为它们能够保证状态的改变是安全的。
### 同步器实现原理
同步器依赖内部的同步队列(一个FIFO双向队列)来完成同步状态的管理,当前线程获取同步状态失败时,同步器会将`当前线程`以及`等待状态`等信息构造成为一个`节点(Node)`并将其加入同步队列,同时会阻塞当前线程;当同步状态释放时,会把首节点中的线程唤醒,使其再次尝试获取同步状态。
`设置尾结点`:通过CAS实现。
`设置头结点`:设置首节点是通过获取同步状态成功的线程来完成的,由于只有一个线程能够成功获取到同步状态,因此设置头节点的方法并不需要使用CAS来保证,它只需要将首节点设置成为原首节点的后继节点并断开原首节点的next引用即可。
### 独占式同步状态获取流程
![](https://img.kancloud.cn/3a/40/3a402a050e9412968653c0e31e2bd325_638x684.png)
1. 在**获取同步状态**时,同步器维护一个同步队列,获取状态失败的线程都会被加入到队列中并在队列中进行自旋;
2. **移出队列**(或停止自旋)的条件是前驱节点为头节点且成功获取了同步状态。
3. 在**释放同步状态**时,同步器调用tryRelease(int arg)方法释放同步状态,然后唤醒头节点的后继节点。
## 悲观锁
### synchronized
- 锁功能的实现:synchronized是通过监视器实现锁功能的。随着jdk版本的升级,synchronized性能不断提升,分为偏向锁、轻量锁、重量锁等。
- 线程唤醒:不能唤醒指定线程。
阻塞方法:wait()
### ReentrantLock
- ReentrantLock是对象锁,使用时需要`new ReentrantLock()`,线程独享,可以唤醒指定线程。
- 阻塞方法:需要用到Condition对象,调用`condition.wait()`方法。
> ReentrantLock是基于CAS实现的悲观锁,从宏观上讲它是悲观锁,从微观上讲,它是基于乐观锁实现的。
## 乐观锁CAS
- 无线程切换
- 阻塞方法:LockSupport.park()
- 解锁方法:LockSupport.unpark(线程名称)
#### Condition对象
每个Condition对象都包含一个队列——**等待队列**,该队列是实现`等待/通知`功能的关键。
![](https://img.kancloud.cn/86/d7/86d7f2edaa1efc73f988598c71b0718a_1171x369.png)
Condition对象拥有等待队列首尾对象的引用。
### LockSupport
- 前言
- 第一部分 计算机网络与操作系统
- 大量的 TIME_WAIT 状态 TCP 连接,对业务有什么影响?怎么处理?
- 性能占用
- 第二部分 Java基础
- 2-1 JVM
- JVM整体结构
- 方法区
- JVM的生命周期
- 堆对象结构
- 垃圾回收
- 调优案例
- 类加载机制
- 执行引擎
- 类文件结构
- 2-2 多线程
- 线程状态
- 锁与阻塞
- 悲观锁与乐观锁
- 阻塞队列
- ConcurrentHashMap
- 线程池
- 线程框架
- 彻底搞懂AQS
- 2-3 Spring框架基础
- Spring注解
- Spring IoC 和 AOP 的理解
- Spring工作原理
- 2-4 集合框架
- 死磕HashMap
- 第三部分 高级编程
- Socket与NIO
- 缓冲区
- Bybuffer
- BIO、NIO、AIO
- Netty的工作原理
- Netty高性能原因
- Rabbitmq
- mq消息可靠性是怎么保障的?
- 认证授权
- 第四部分 数据存储
- 第1章 mysql篇
- MySQL主从一致性
- Mysql的数据组织方式
- Mysql性能优化
- 数据库中的乐观锁与悲观锁
- 深度分页
- 从一条SQL语句看Mysql的工作流程
- 第2章 Redis
- Redis缓存
- redis key过期策略
- 数据持久化
- 基于Redis分布式锁的实现
- Redis高可用
- 第3章 Elasticsearch
- 全文查询为什么快
- battle with mysql
- 第五部分 数据结构与算法
- 常见算法题
- 基于数组实现的一个队列
- 第六部分 真实面试案例
- 初级开发面试材料
- 答案部分
- 现场编码
- 第七部分 面试官角度
- 第八部分 计算机基础
- 第九部分 微服务
- OpenFeign工作原理