synchorinzed作用域反編譯出來的一點東西

synchronized可以作用在方法上,也可以作用在代碼塊上,而從編譯角度來說,這兩者是有所區別的。
如果作用在方法上,對對應的class文件使用javap進行反編譯是這樣的:
在這裏插入圖片描述
對應方法的標記位上有ACC_SYNCHRONIZED的標記,JVM是通過這個標記來識別這是一個synchronized方法

而如果作用在代碼塊上,反編譯後發現,有一個monitorenter指令來控制線程進入同步代碼塊,對應的也有一個monitorexit指令來控制線程退出同步代碼塊。
在這裏插入圖片描述
這是它們的區別。

再加一個小彩蛋吧,整理一下回答cas的思路:
cas就是compareAndSwap,比較並替換,其實它的核心思想非常簡單,就是維護了三個值:。。。。
cas它只是一種思想,操作系統就對這種思想進行了實現,從彙編角度來說,cas對應一個叫做cmpxchg的彙編指令,這個指令是cpu原語嘛,所以從操作系統角度就能保證這個比較並替換的操作是一個原子操作。
cas在java中的實現:atomic->unsafe->openjdk上的c++類,調用了cmpxchg這個彙編指令來完成比較並替換的操作。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章