1. 程式人生 > >是兄弟!就來看這篇多執行緒!叄

是兄弟!就來看這篇多執行緒!叄

### 開篇閒扯 打工人,打工魂,我們生而人上人。當“資本主義”逐漸禁錮我們人(大)上(韭)人(菜)肉體的時候,那一刻我才明白那個日不落帝國·資本主義收割機·瑞民族之光幸·瑞幸咖啡是多麼的了不起,儘管我不懂咖啡,但還是要說一聲謝謝!說到咖啡,喝完就想上廁所,對寫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."