重要的網址
1. https://www.cnblogs.com/charlesblc/p/5994162.html synchronized鎖的優化過程很全面
2. https://www.cnblogs.com/skywang12345/ 系列教程
一、什么是synchronized?
synchronized
是Java提供的一個並發控制的關鍵字,作用於對象上。主要有兩種用法,分別是同步方法(訪問對象和clss對象)和同步代碼塊(需要加入對象),保證了代碼的原子性和可見性以及有序性,但是不會處理重排序以及代碼優化的過程,但是在一個線程中執行肯定是有序的,因此是有序的。
二、synchronized的基本原理
原理是借用對象markword中的標記以及monitor監控器生成monitorEnter以及monitorExit指令以及對應的計數器。
三、jdk1.6之后的synchronized
在jdk1.6之前,synchronized是非常重量級的,因為它會無時無刻進行鎖住對象,而不考慮到程序實際的競爭情況,大多數程序在都是進行交替執行,也就是說不存在資源的競爭,如果沒有競爭,但是加鎖,加鎖和解鎖是非常耗費性能的,(重量級)因為線程之間的切換以及線程從內核態到用戶態的時間是耗費性能的。
在jdk1.6之后,sun公司對synchronized進行了大幅度的優化,現在采用偏向鎖+(輕量級鎖+cas)+重量級,之間通過鎖碰撞進行切換。
以上是鎖的膨脹過程,但是可能不正確。
三、為什么說sychronized是基於jvm的
訪問互斥
JVM 通過對象鎖來實現互斥:
-
typedef struct object {
-
uintptr_t lock;
-
Class * class;
-
} Object
同步協作
協作是通過 Object wait, notify/notifyAll 方法實現的。
對應到JVM 的底層術語,這一機制叫做 monitor:
四、與lock的簡單對比