也有利于了解作業系統的同步
知識果然是息息相關的
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,聽老師說了:同步代碼方法與同步代碼塊,相比同步代碼塊會更好
現在知道原因了:
同步代碼塊針對具體資源對象(遇到了的)進行鎖放
而同步方法會把相關資源對象全部鎖放
我是如此了解的,當然運用他們的時間不是絕對的
有錯望大佬指出