从操作系统的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,聽老師說了:同步代碼方法與同步代碼塊,相比同步代碼塊會更好
現在知道原因了:
同步代碼塊針對具體資源對象(遇到了的)進行鎖放
而同步方法會把相關資源對象全部鎖放
我是如此理解的,當然運用他們的時間不是絕對的
有錯望大佬指出
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的从操作系统的PV操作理解JAVA的synchronized同步方法,同步代码块实现,及比较的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java图片转ascii字符画(转载)
- 下一篇: 常用的汇编系统功能指令(包含字符功能类,