溫馨提示×

溫馨提示×

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

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

Java對象級別與類級別的同步鎖synchronized語法怎么用

發(fā)布時間:2022-03-15 14:44:26 來源:億速云 閱讀:129 作者:iii 欄目:開發(fā)技術(shù)

本篇內(nèi)容主要講解“Java對象級別與類級別的同步鎖synchronized語法怎么用”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Java對象級別與類級別的同步鎖synchronized語法怎么用”吧!

Java synchronized 關(guān)鍵字 可以將一個代碼塊或一個方法標記為同步代碼塊。同步代碼塊是指同一時間只能有一個線程執(zhí)行的代碼,并且執(zhí)行該代碼的線程持有同步鎖。synchronized關(guān)鍵字可以作用于

  • 一個代碼塊

  • 一種方法

當一個方法或代碼塊被聲明為synchronized時,如果一個線程正在執(zhí)行該synchronized 方法或代碼塊,其他線程會被阻塞,直到持有同步鎖的線程釋放。根據(jù)鎖定的范圍可以分為

  • 類級別的鎖可以防止多個線程在運行時同時進入該類所有實例化對象的 synchronized代碼塊中。

  • 對象級別的鎖可以防止多個線程在運行時同時進入當前(或某一個)實例化對象的 synchronized代碼塊中。

1. 對象級別的同步鎖

對象級別的同步鎖:當我們想要在多線程環(huán)境下同步執(zhí)行一個非靜態(tài)方法或非靜態(tài)代碼塊時,在類的方法或代碼塊加上synchronized關(guān)鍵字,可以保證對象實例級別數(shù)據(jù)的線程安全。(比較后文的類級別的同步鎖,回頭來理解這句話)

對象級別的加鎖的代碼如下,如:在方法上加鎖,鎖對象為當前類的實例化對象

public class DemoClass{
	public synchronized void demoMethod(){}
}

如:為代碼塊加鎖,鎖對象為this對象

public class DemoClass{
	public void demoMethod(){
		synchronized (this){
			//同步代碼塊
		}
	}
}

如:為代碼塊加鎖,鎖對象為我們創(chuàng)建的任意一個對象。不要使用非final的成員變量作為同步鎖對象,因為非final成員變量可以被重新賦值,導致不同的線程使用不同的對象作為鎖,達不到同步鎖定的效果。

public class DemoClass{
    //注意這里的關(guān)鍵字final非常重要,看說明
	private final Object lock = new Object();
	public void demoMethod(){
		synchronized (lock){
			//同步代碼塊
		}
	}
}

2. 類級別的同步鎖

類級別的鎖可以防止多個線程在運行時進入該類所有實例化對象的 "synchronized塊中。也就是說如果運行時有100個DemoClass的實例,那么每次只有一個線程能夠在任何一個實例中執(zhí)行demoMethod(),所有其他實例的所有其他線程都被鎖定。

為了保障靜態(tài)數(shù)據(jù)線程安全,應該使用類級別的鎖定。我們知道static關(guān)鍵字將方法的數(shù)據(jù)關(guān)聯(lián)到類的級別上,所以在靜態(tài)方法上使用鎖。

靜態(tài)方法加鎖,對該類所有的實例化對象生效

public class DemoClass{
	//靜態(tài)方法加鎖,對該類所有的實例化對象生效
	public synchronized static void demoMethod(){
	}
}

獲取 .class類的引用,類級別的鎖

public class DemoClass{
	public void demoMethod(){
		//獲取 .class類的引用,類級別的鎖,對該類所有的實例化對象生效
		synchronized (DemoClass.class){
			//同步代碼塊
		}
	}
}

使用靜態(tài)對象的鎖,類級別的鎖

public class DemoClass{
    //靜態(tài)對象,類級別,注意這里的關(guān)鍵字final非常重要
	private final static Object lock = new Object();
	public void demoMethod(){
		//使用靜態(tài)對象的鎖,類級別鎖,對該類所有的實例化對象生效
		synchronized (lock){
			//同步代碼塊
		}
	}
}

到此,相信大家對“Java對象級別與類級別的同步鎖synchronized語法怎么用”有了更深的了解,不妨來實際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進入相關(guān)頻道進行查詢,關(guān)注我們,繼續(xù)學習!

向AI問一下細節(jié)

免責聲明:本站發(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