synchronized底層實(shí)現(xiàn)原理

synchronized (this)原理

這里寫(xiě)圖片描述

涉及兩條指令:(1)monitorenter

每個(gè)對(duì)象有一個(gè)監(jiān)視器鎖(monitor)。當(dāng)monitor被占用時(shí)就會(huì)處于鎖定狀態(tài),線程執(zhí)行monitorenter指令時(shí)嘗試獲取monitor的所有權(quán),過(guò)程如下:

1、如果monitor的進(jìn)入數(shù)為0,則該線程進(jìn)入monitor,然后將進(jìn)入數(shù)設(shè)置為1,該線程即為monitor的所有者。

2、如果線程已經(jīng)占有該monitor,只是重新進(jìn)入,則進(jìn)入monitor的進(jìn)入數(shù)加1。

3、如果其他線程已經(jīng)占用了monitor,則該線程進(jìn)入阻塞狀態(tài),直到monitor的進(jìn)入數(shù)為0,再重新嘗試獲取monitor的所有權(quán)。

(2)monitorexit

執(zhí)行monitorexit的線程必須是objectref所對(duì)應(yīng)的monitor的所有者。

指令執(zhí)行時(shí),monitor的進(jìn)入數(shù)減1,如果減1后進(jìn)入數(shù)為0,那線程退出monitor,不再是這個(gè)monitor的所有者。其他被這個(gè)monitor阻塞的線程可以嘗試去獲取這個(gè)
monitor 的所有權(quán)。

通過(guò)這兩段描述,我們應(yīng)該能很清楚的看出synchronized的實(shí)現(xiàn)原理,synchronized的語(yǔ)義底層是通過(guò)一個(gè)monitor的對(duì)象來(lái)完成。
其實(shí)wait/notify等方法也依賴于monitor對(duì)象,這就是為什么只有在同步的塊或者方法中才能調(diào)用wait/notify等方法,否則會(huì)拋出java.lang.IllegalMonitorStateException的異常的原因。

同步方法

public synchronized void method() {
         System.out.println("Hello World!");
}
這里寫(xiě)圖片描述

從反編譯的結(jié)果來(lái)看,方法的同步并沒(méi)有通過(guò)指令monitorenter和monitorexit來(lái)完成(理論上其實(shí)也可以通過(guò)這兩條指令來(lái)實(shí)現(xiàn))。

相對(duì)于普通方法,其常量池中多了ACC_SYNCHRONIZED標(biāo)示符

JVM就是根據(jù)該標(biāo)示符來(lái)實(shí)現(xiàn)方法的同步的:當(dāng)方法被調(diào)用時(shí),調(diào)用指令將會(huì)檢查方法的 ACC_SYNCHRONIZED 訪問(wèn)標(biāo)志是否被設(shè)置,如果設(shè)置了,執(zhí)行線程將先獲取monitor,獲取成功之后才能執(zhí)行方法體,方法執(zhí)行完后再釋放monitor。在方法執(zhí)行期間,其他任何線程都無(wú)法再獲得同一個(gè)monitor對(duì)象。 其實(shí)本質(zhì)上沒(méi)有區(qū)別,只是方法的同步是一種隱式的方式來(lái)實(shí)現(xiàn),無(wú)需通過(guò)字節(jié)碼來(lái)完成。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • Synchronized是Java中實(shí)現(xiàn)進(jìn)程同步最簡(jiǎn)單的一種方式,Synchronized主要有以下三個(gè)作用: 保...
    李牙刷兒閱讀 1,157評(píng)論 0 4
  • 一、Synchronized的基本使用Synchronized是Java中解決并發(fā)問(wèn)題的一種最常用的方法,也是最簡(jiǎn)...
    yeying12321閱讀 668評(píng)論 0 0
  • 概述 互斥訪問(wèn):synchronized可以保證在同一個(gè)時(shí)刻,只有一個(gè)線程可以執(zhí)行某個(gè)方法或者某個(gè)代碼塊(主要是對(duì)...
    jiangmo閱讀 596評(píng)論 0 1
  • 2608字,建議閱讀5分鐘。你可以收獲的知識(shí)要點(diǎn)如下: “XXX也這么做”的絕大多數(shù)使用場(chǎng)景是:**當(dāng)有人對(duì)自己做...
    41aa8c261c93閱讀 269評(píng)論 0 1
  • 1月30日 星期一 晴 春節(jié)是我國(guó)的傳統(tǒng)節(jié)日,今年春節(jié),我跟爸爸回甘肅奶奶家過(guò)春節(jié)。。每次過(guò)春節(jié),家家都要貼春聯(lián)、...
    魏一一閱讀 956評(píng)論 5 3