您好,登錄后才能下訂單哦!
本篇內容主要講解“Java對象級別與類級別的同步鎖synchronized語法怎么用”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Java對象級別與類級別的同步鎖synchronized語法怎么用”吧!
Java synchronized 關鍵字 可以將一個代碼塊或一個方法標記為同步代碼塊。同步代碼塊是指同一時間只能有一個線程執行的代碼,并且執行該代碼的線程持有同步鎖。synchronized
關鍵字可以作用于
一個代碼塊
一種方法
當一個方法或代碼塊被聲明為synchronized時,如果一個線程正在執行該synchronized 方法或代碼塊,其他線程會被阻塞,直到持有同步鎖的線程釋放。根據鎖定的范圍可以分為
類級別的鎖可以防止多個線程在運行時同時進入該類所有實例化對象的 synchronized代碼塊中。
對象級別的鎖可以防止多個線程在運行時同時進入當前(或某一個)實例化對象的 synchronized代碼塊中。
對象級別的同步鎖:當我們想要在多線程環境下同步執行一個非靜態方法或非靜態代碼塊時,在類的方法或代碼塊加上synchronized關鍵字,可以保證對象實例級別數據的線程安全。(比較后文的類級別的同步鎖,回頭來理解這句話)
對象級別的加鎖的代碼如下,如:在方法上加鎖,鎖對象為當前類的實例化對象
public class DemoClass{ public synchronized void demoMethod(){} }
如:為代碼塊加鎖,鎖對象為this對象
public class DemoClass{ public void demoMethod(){ synchronized (this){ //同步代碼塊 } } }
如:為代碼塊加鎖,鎖對象為我們創建的任意一個對象。不要使用非final的成員變量作為同步鎖對象,因為非final成員變量可以被重新賦值,導致不同的線程使用不同的對象作為鎖,達不到同步鎖定的效果。
public class DemoClass{ //注意這里的關鍵字final非常重要,看說明 private final Object lock = new Object(); public void demoMethod(){ synchronized (lock){ //同步代碼塊 } } }
類級別的鎖可以防止多個線程在運行時進入該類所有實例化對象的 "synchronized塊中。也就是說如果運行時有100個DemoClass
的實例,那么每次只有一個線程能夠在任何一個實例中執行demoMethod()
,所有其他實例的所有其他線程都被鎖定。
為了保障靜態數據線程安全,應該使用類級別的鎖定。我們知道static關鍵字將方法的數據關聯到類的級別上,所以在靜態方法上使用鎖。
靜態方法加鎖,對該類所有的實例化對象生效
public class DemoClass{ //靜態方法加鎖,對該類所有的實例化對象生效 public synchronized static void demoMethod(){ } }
獲取 .class類的引用,類級別的鎖
public class DemoClass{ public void demoMethod(){ //獲取 .class類的引用,類級別的鎖,對該類所有的實例化對象生效 synchronized (DemoClass.class){ //同步代碼塊 } } }
使用靜態對象的鎖,類級別的鎖
public class DemoClass{ //靜態對象,類級別,注意這里的關鍵字final非常重要 private final static Object lock = new Object(); public void demoMethod(){ //使用靜態對象的鎖,類級別鎖,對該類所有的實例化對象生效 synchronized (lock){ //同步代碼塊 } } }
到此,相信大家對“Java對象級別與類級別的同步鎖synchronized語法怎么用”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。