[TOC]
<br/>
> ### `Synchronized`同步類型
* 對于普通同步方法,鎖是當前實例對象。
* 對于靜態同步方法,鎖是當前類的`Class`對象。
* 對于同步方法塊,鎖是`Synchonized`括號里配置的對象。
<br/>
> ### `Synchronized`底層實現
* `JVM`基于進入和退出`Monitor`對象來實現方法同步和代碼塊同步,但兩者的實現細節不一樣。代碼塊同步是使用`monitorenter`和`monitorexit`指令實現的。 `monitorenter`指令是在編譯后插入到同步代碼塊的開始位置,而`monitorexit`是插入到方法結束處和異常處,任何對象都有一個`monitor`與之關聯,當且一個`monitor`被持有后,它將處于鎖定狀態。線程執行到`monitorenter`指令時,將會嘗試獲取對象所對應的`monitor`的所有權,即嘗試獲得對象的鎖。
* `synchronized`用的鎖是存在`Java`對象頭里的`Mark Word`
<br/>
> ### `Java`對象頭
* 如果對象是數組類型,則虛擬機用3個字寬(`Word`)存儲對象頭,如果對象是非數組類型,則用2字寬存儲對象頭。數組對象相對于普通對象多了一個字寬記錄數組長度。

<br/>
> ### `Java1.6`之后鎖的升級
* **偏向鎖**,偏向鎖使用了一種等到競爭出現才釋放鎖的機制,所以當其他線程嘗試競爭偏向鎖時,持有偏向鎖的線程才會釋放鎖。偏向鎖的鎖記錄存儲在對象頭中。

* **輕量級鎖**,線程在執行同步塊之前,JVM會先在當前線程的棧楨中創建用于存儲鎖記錄的空間,并將對象頭中的`Mark Word`復制到鎖記錄中,官方稱為`Displaced Mark Word`。然后線程嘗試使用CAS將對象頭中的Mark Word替換為指向鎖記錄的指針。如果成功,當前線程獲得鎖,如果失敗,表示其他線程競爭鎖,當前線程便嘗試使用自旋來獲取鎖。

* 偏向鎖、輕量級鎖、重量級鎖對比

- asD
- Java
- Java基礎
- Java編譯器
- 反射
- collection
- IO
- JDK
- HashMap
- ConcurrentHashMap
- LinkedHashMap
- TreeMap
- 阻塞隊列
- java語法
- String.format()
- JVM
- JVM內存、對象、類
- JVM GC
- JVM監控
- 多線程
- 基礎概念
- volatile
- synchronized
- wait_notify
- join
- lock
- ThreadLocal
- AQS
- 線程池
- Spring
- IOC
- 特性介紹
- getBean()
- creatBean()
- createBeanInstance()
- populateBean()
- AOP
- 基本概念
- Spring處理請求的過程
- 注解
- 微服務
- 服務注冊與發現
- etcd
- zk
- 大數據
- Java_spark
- 基礎知識
- Thrift
- hdfs
- 計算機網絡
- OSI七層模型
- HTTP
- SSL
- 數據庫
- Redis
- mysql
- mybatis
- sql
- 容器
- docker
- k8s
- nginx
- tomcat
- 數據結構/算法
- 排序算法
- 快排
- 插入排序
- 歸并排序
- 堆排序
- 計算時間復雜度
- leetcode
- LRU緩存
- B/B+ 樹
- 跳躍表
- 設計模式
- 單例模式
- 裝飾者模式
- 工廠模式
- 運維
- git
- 前端
- thymeleaf
- 其他
- 代碼規范
- work_project
- Interview