溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

java中synchronized關(guān)鍵字怎么使用

發(fā)布時間:2021-07-23 15:40:49 來源:億速云 閱讀:138 作者:Leah 欄目:云計算

今天就跟大家聊聊有關(guān)java中synchronized關(guān)鍵字怎么使用,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

說明:

java中的同步(synchronized)是基于進入monitor對象和退出monitor對象來實現(xiàn)的,無論是顯式同步還是隱式同步。

synchronized語句塊:

1)(使用javap -c 類名)將class文件反編譯后可以看到:同步塊的入口位置和出口位置(方法結(jié)束處和異常處)分別插入了monitorenter字節(jié)碼指令和monitorexit字節(jié)碼指令,故同步代碼塊屬于顯示同步。
2)線程執(zhí)行到monitorenter指令時,嘗試獲取對象的鎖。

synchronized方法:

1)JVM從Class文件中的方法結(jié)構(gòu)(method_info)中的 ACC_SYNCHRONIZED 訪問標(biāo)志區(qū)分一個方法是否為同步方法,故同步方法屬于隱式同步。
2)當(dāng)方法調(diào)用時,調(diào)用指令會檢查方法的ACC_SYNCHRONIZED訪問標(biāo)志是否被設(shè)置,如果設(shè)置了,執(zhí)行線程將先持有monitor,然后再執(zhí)行方法,最后在方法完成時釋放monitor。
3)在方法執(zhí)行期間,其它線程無法獲取該monitor。
4)如果一個同步方法執(zhí)行期間拋出了異常,并且在方法內(nèi)部無法處理此異常,那這個同步方法所持有的monitor將在異常拋到同步方法之外時自動釋放。

method_info 結(jié)構(gòu)格式如下(java虛擬機規(guī)范中的摘錄):
	method_info {
		u2 access_flags;	// 用于定義當(dāng)前方法的訪問權(quán)限和基本屬性的標(biāo)志
		u2 name_index;
		u2 descriptor_index;
		u2 attributes_count;
		attribute_info attributes[attributes_count];
	}
	method_info結(jié)構(gòu)中訪問標(biāo)記(access_flags)的取值:
		標(biāo)記名				值		說明
		ACC_PUBLIC			0x0001	public,方法可以從包外訪問
		ACC_PRIVATE			0x0002  private,方法只能本類中訪問
		ACC_PROTECTED		0x0004  protected,方法在自身和子類可以訪問
		ACC_STATIC			0x0008  static,靜態(tài)方法
		ACC_FINAL			0x0010  final,方法不能被重寫
		ACC_SYNCHRONIZED	0x0020  synchronized,方法由monitor同步
		...

獲取鎖和釋放鎖的內(nèi)存原語:

	當(dāng)線程獲取鎖時,JMM會把該線程對應(yīng)的本地內(nèi)存置為無效。從而使得被monitor保護的臨界區(qū)代碼必須從主內(nèi)存中讀取共享變量。
	當(dāng)線程釋放鎖時,JMM會把該線程對應(yīng)的本地內(nèi)存中的共享變量刷新到主內(nèi)存中
	即:
		1將本地內(nèi)存中的數(shù)據(jù)設(shè)置為無效,
		2從主內(nèi)存中將數(shù)據(jù)復(fù)制到本地內(nèi)存中,
		3在本地內(nèi)存中進行操作,
		4操作完成后將本地內(nèi)存中的數(shù)據(jù)刷新到主內(nèi)存中。整體看起來就像是直接在主內(nèi)存中操作一樣。

synchronized的可重入性:

1)當(dāng)一個線程再次請求自己持有對象鎖的臨界資源時,這種情況屬于重入鎖,請求將會成功。
2)由于synchronized是基于monitor實現(xiàn)的,故每次重入,monitor中的計數(shù)器仍會加1。

看完上述內(nèi)容,你們對java中synchronized關(guān)鍵字怎么使用有進一步的了解嗎?如果還想了解更多知識或者相關(guān)內(nèi)容,請關(guān)注億速云行業(yè)資訊頻道,感謝大家的支持。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI