天天看點

從作業系統的PV操作了解JAVA的synchronized同步方法,同步代碼塊實作,及比較

也有利于了解作業系統的同步

知識果然是息息相關的

JAVA同樣離不開作業系統的原理,不過他展現在虛拟機JVM中

synchronized關鍵字是同步關鍵字

首先我們知道在作業系統裡

PV兩者操作資訊量S的自增自減

P自增

V自減

現在類比知道在JVM中:

【知道JVM的本地方法棧與底層的作業系統OS息息相關】

同步方法:

例:

//同步方法
public synchronized void getS(){
//do
}
           

JVM中有一個ACC_SYNCHRONIZED标記符【在同步方法的常量池中】,類比作業系統中的資訊量S

:當線程要通路一個方法時方法,就會去檢查ACC_SYNCHRONIZED,如果本地方法棧有這個變量【此處展現作業系統對資訊量ACC_SYNCHRONIZED的操作,P操作】,

就會去得到一個相關與方法的螢幕鎖,在方法執行完就釋放螢幕鎖【此處展現作業系統對資訊量ACC_SYNCHRONIZED的操作,V操作,異常時同】

:當其他線程通路這個方法時,會被螢幕鎖阻止

螢幕鎖除了正常釋放,還有該方法有異常抛出未處理時,也會釋放。

同步代碼塊(針對資源對象,一般寫this,代指本身):

例:

public void getS(){
//do
//同步代碼塊
synchronized(this){
//do
}
}
           

JVM采用

monitorenter(加鎖P)、monitorexit(釋放鎖V)

兩個指令來實作同步

每個資源對象都有一個被記錄 被鎖次數 的變量(資訊量),值為0時代表未上鎖

當一個線程擷取該資源對象的鎖後,計數器加一,如果同一線程多次擷取相同資源對象的鎖後,計數器都會加一【P操作】

該線程釋放鎖後,計數器會減一,當計數器減到0時,資源對象會傳回到未鎖狀态【V操作】

此時别的線程就可以通路該資源對象。

剛剛學了基礎的JVM,聽老師說了:同步代碼方法與同步代碼塊,相比同步代碼塊會更好

現在知道原因了:

同步代碼塊針對具體資源對象(遇到了的)進行鎖放

而同步方法會把相關資源對象全部鎖放

我是如此了解的,當然運用他們的時間不是絕對的

有錯望大佬指出