Java 多執行緒4 monitor機制

2021-09-19 08:13:12 字數 1567 閱讀 2591

##物件鎖(monitor)

同步**塊:

執行同步**塊後首先執行monitorenter指令,退出時執行monitorexit指令

使用內建鎖(synchronize)實現同步,關鍵在於要獲取指定物件monitor監視器,當執行緒獲取monitor後才繼續向下執行,否則就只能等待。這個過程是互斥的,每個時刻只能有乙個執行緒獲取物件的monitor。

通常乙個monitor指令會包含若干個monitorexit指令,原因是jvm需要確保鎖在正常執行路徑和在異常執行路徑上都可以正常的解鎖。

同步方法:當使用synchronize修飾方法時,編譯後的位元組碼中訪問標記多了乙個acc_synchronize。該標記表示,進入該方法時,jvm均需要進行monitorenter操作,退出該方法時,無論正常返回,jvm均需要進行monitorexit操作。

鎖的獲取過程:

當執行monitorenter時,如果目標鎖物件的monitor計數器為0,表示此物件沒有被任何其他鎖持有。此時jvm會將鎖持有執行緒設定為當前執行緒,並將計數器加1;如果目標計數器不為0,判斷鎖持有的執行緒是否是當前執行緒,如果是計數器再次加1(鎖的可重入性)。如果所物件的持有執行緒不是當前執行緒,當前執行緒需要等待,直至持有執行緒釋放鎖。

鎖的釋放過程:

當執行monitorexit時,jvm會將物件計數器-1.當技術器減為0時,代表該物件已經被釋放。

可重入:

class

mythread

implements

runnable

public

synchronized

void

test1()

teat2()

;}public

synchronized

void

teat2()

}public

class

test

}

互斥性:

class

mythread

implements

runnable

public

synchronized

void

test1()

}}public

synchronized

void

teat2()

else}}

public

class

test

catch

(interruptedexception e)

//----------------------------

newthread

(mt,

"b")

.start()

;}}

互斥性:同一時刻只有乙個執行緒持有鎖:

執行緒a,進入test1,執行緒b:不能進入test2

上面的**讓執行緒a先進入,然後迴圈,

如果執行緒b可以進入test2,那麼就會列印"執行緒b進入同步方法2"

但是事實上 執行緒一直處於阻塞狀態,沒有進入**塊。

多執行緒同步 Monitor

多執行緒一直在學習和理解中.monitor類是多執行緒中用以實現同步的一種技術,主要是同一程序內多執行緒間的同步技術。monitor類中有以下幾個方法需要注意 monitor.enter object obj 方法,其意義相當於lock obj monitor.exit object obj 方法,...

java多執行緒初識4

程序的概念 程序 官方的語言是計算機中的程式,關於某資料集合上的一次執行活動。使系統進行資源分配和排程的基本單位單位,是作業系統的基本單位,是作業系統結構的基礎。在現在的執行緒設計的計算機結構中,程序是執行緒的容器,程式是指令資料及組織形式的描述,程序是程式的實體,但是總的來說 程序是執行緒的容器。...

Java多執行緒 4 執行緒間通訊

有這麼幾個方法,它們就定義在大家都非常熟悉的object類中,但是大家卻從來沒有呼叫過,並且也不知道是做什麼的,今天就由我帶著你們熟悉一下下面的這三個方法。它們都是定義在object類中的final方法,並且只能在synchronized上下文中呼叫。如果你現在還不明白,沒關係,下面我會用乙個 生產...