[toc]
提幾個問題:
- synchronized保證原子性,volatile保證可見性;
- 不用volatile,只用synchronized修飾,能保證可見性嗎?
## 隊列同步器AQS
隊列同步器AbstractQueuedSynchronizer(以下簡稱同步器),是用來構建鎖或者其他同步組件的基礎框架。
使用同步器提供的3個方法(getState()、setState(int newState)和compareAndSetState(int expect,int update))來進行操作,因為它們能夠保證狀態的改變是安全的。
### 同步器實現原理
同步器依賴內部的同步隊列(一個FIFO雙向隊列)來完成同步狀態的管理,當前線程獲取同步狀態失敗時,同步器會將`當前線程`以及`等待狀態`等信息構造成為一個`節點(Node)`并將其加入同步隊列,同時會阻塞當前線程;當同步狀態釋放時,會把首節點中的線程喚醒,使其再次嘗試獲取同步狀態。
`設置尾結點`:通過CAS實現。
`設置頭結點`:設置首節點是通過獲取同步狀態成功的線程來完成的,由于只有一個線程能夠成功獲取到同步狀態,因此設置頭節點的方法并不需要使用CAS來保證,它只需要將首節點設置成為原首節點的后繼節點并斷開原首節點的next引用即可。
### 獨占式同步狀態獲取流程

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對象都包含一個隊列——**等待隊列**,該隊列是實現`等待/通知`功能的關鍵。

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工作原理