是兄弟!就來看這篇多執行緒!叄
阿新 • • 發佈:2020-12-02
### 開篇閒扯
打工人,打工魂,我們生而人上人。當“資本主義”逐漸禁錮我們人(大)上(韭)人(菜)肉體的時候,那一刻我才明白那個日不落帝國·資本主義收割機·瑞民族之光幸·瑞幸咖啡是多麼的了不起,儘管我不懂咖啡,但還是要說一聲謝謝!說到咖啡,喝完就想上廁所,對寫bug的我來說太不友好了,畢竟我不(很)喜歡帶薪上廁所。
迴歸本次的不正經Java文章,本次新聞主要內容有...tui~~嘴瓢了。上篇文章末尾處已經提到了,主要會把我對Synchronized的理解進行一次全方位的梳理,如果能幫助到大家吊打面試官,萬分榮幸。
### Synchronized起源
那是個月黑風高的夜晚,Doug Lee先生像我們一樣喝了咖啡憋著尿加班到深夜,只是他在寫JDK,我們在用他的JDK寫BUG。在創作JDK1.5之前,他忘了在Java語言中提供同步可擴充套件的同步介面或者方法了,於是在1.5之前給了我們一個惡Synchronized湊合用一下,而到了JDK1.5之後,增加了Lock介面及很多原生的併發包供我們使用。因此,Synchronized作為關鍵字的形式存在了很久,且在後續JDK1.6的版本中對它做了很多優化,從而提升它的效能,使它能夠跟Lock有一戰之力。好了,講完了,再見!
### Synchronized是什麼
如果我說,Synchronized是一種基於JVM中物件監視器的隱式非公平可重入重量級鎖(這頭銜跟瑞幸有一拼),加解鎖都是靠JVM內部自動實現的,吧啦吧啦...簡稱"面試八股文",很顯然我不能這麼寫,這樣還不如直接甩個部落格連結來的快。來,解釋一下上面那句話,隱式鎖是基於作業系統的MutexLock實現的,每次加解鎖操作都會帶來**使用者態**與**核心態**的切換,導致系統增加很多額外的開銷。可以自行百度學習一下使用者態與核心態的定義,這裡就不贅述了。同時Synchronized的加解鎖過程開發人員是不可控的,失去了可擴充套件性。
接下來我們通過一個例子,看一看Synchronized在編譯後到底是什麼樣子,上才(代)藝(碼):
```
/**
* FileName: SynchronizeDetail
* Author: RollerRunning
* Date: 2020/11/30 10:10 PM
* Description: 詳解Synchronized
*/
public class SynchronizeDetail {
public synchronized void testRoller() {
System.out.println("Roller Running!");
}
public void testRunning(){
synchronized (SynchronizeDetail.class){
System.out.println("Roller Running!");
}
}
}
```
將上面的原始碼進行編譯再輸出編譯後的程式碼:
```
public com.design.model.singleton.SynchronizeDetail();
descriptor: ()V
flags: ACC_PUBLIC
Code:
stack=1, locals=1, args_size=1
0: aload_0
1: invokespecial #1 // Method java/lang/Object."