方法鎖薄疚,對象鎖以及類鎖的用法與區(qū)別

首先得明白Java中synchronized用法

synchronized

  • 在修飾代碼塊的時候需要一個reference對象作為鎖的對象.
  • 在修飾方法的時候默認是當(dāng)前對象作為鎖的對象.
  • 在修飾類時候默認是當(dāng)前類的Class對象作為鎖的對象.

下面具體講講三種鎖得區(qū)別與用法

方法鎖(synchronized修飾方法時)

通過在方法聲明中加入 synchronized關(guān)鍵字來聲明 synchronized 方法。

synchronized 方法控制對類成員變量的訪問:
每個類實例對應(yīng)一把鎖囚聚,每個 synchronized 方法都必須獲得調(diào)用該方法的類實例的鎖方能執(zhí)行援奢,否則所屬線程阻塞,方法一旦執(zhí)行朋蔫,就獨占該鎖,直到從該方法返回時才將鎖釋放却汉,此后被阻塞的線程方能獲得該鎖,重新進入可執(zhí)行狀態(tài)荷并。這種機制確保了同一時刻對于每一個類實例合砂,其所有聲明為 synchronized 的成員函數(shù)中至多只有一個處于可執(zhí)行狀態(tài),從而有效避免了類成員變量的訪問沖突源织。

對象鎖(synchronized修飾方法或代碼塊)

當(dāng)一個對象中有synchronized method或synchronized block的時候調(diào)用此對象的同步方法或進入其同步區(qū)域時翩伪,就必須先獲得對象鎖。如果此對象的對象鎖已被其他調(diào)用者占用谈息,則需要等待此鎖被釋放缘屹。(方法鎖也是對象鎖中的一種)

java的所有對象都含有1個互斥鎖,這個鎖由JVM自動獲取和釋放侠仇。線程進入synchronized方法的時候獲取該對象的鎖轻姿,當(dāng)然如果已經(jīng)有線程獲取了這個對象的鎖,那么當(dāng)前線程會等待逻炊;synchronized方法正常返回或者拋異常而終止互亮,JVM會自動釋放對象鎖。這里也體現(xiàn)了用synchronized來加鎖的1個好處余素,方法拋異常的時候豹休,鎖仍然可以由JVM來自動釋放。

對象鎖的兩種形式:

public class TestSynchronized1{
    
    //方法鎖(實質(zhì)也是對象鎖的一種桨吊,鎖定的對象是this)
    public synchornized void method1(){
        System.out.println("This is a test");
    }

    //對象鎖
    public void method2(){
        synchornized(this){
            System.out.println("This is a test");
        }
        
    }

}
類鎖(synchronized 修飾靜態(tài)的方法或代碼塊)

由于一個class不論被實例化多少次威根,其中的靜態(tài)方法和靜態(tài)變量在內(nèi)存中都只有一份凤巨。所以,一旦一個靜態(tài)的方法被申明為synchronized洛搀。此類所有的實例化對象在調(diào)用此方法敢茁,共用同一把鎖,我們稱之為類鎖姥卢。

對象鎖是用來控制實例方法之間的同步卷要,類鎖是用來控制靜態(tài)方法(或靜態(tài)變量互斥體)之間的同步。

類鎖只是一個概念上的東西独榴,并不是真實存在的僧叉,它只是用來幫助我們理解鎖定實例方法和靜態(tài)方法的區(qū)別的。

java類可能會有很多個對象棺榔,但是只有1個Class對象瓶堕,也就是說類的不同實例之間共享該類的Class對象。Class對象其實也僅僅是1個java對象症歇,只不過有點特殊而已郎笆。由于每個java對象都有1個互斥鎖,而類的靜態(tài)方法是需要Class對象忘晤。所以所謂的類鎖宛蚓,不過是Class對象的鎖而已。獲取類的Class對象有好幾種设塔,最簡單的就是[類名.class]的方式凄吏。

下面是類鎖的兩種不同形式的寫法:

public class TestSynchronized2{
    
    //直接在靜態(tài)方法前加synchronized
    public static synchornized void method1(){
        System.out.println("This is a test");
    }

    //將TestSynchronized2.class作為鎖對象
    public static void method2(){
        synchornized(TestSynchronized2.calss){
            System.out.println("This is a test");
        }
        
    }

}

總結(jié)

本質(zhì)上, synchronized 關(guān)鍵字會鎖定一個對象(當(dāng)修飾一個方法時闰蛔,會獲鎖定當(dāng)前類的實例對象this痕钢,當(dāng)修飾代碼塊時,會鎖定指定的任意對象序六,可以是Class對象任连,也可以是類中新new出來的對象),而鎖定的這個對象的生命周期決定了這個鎖互斥訪問的范圍例诀。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末随抠,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子繁涂,更是在濱河造成了極大的恐慌暮刃,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件爆土,死亡現(xiàn)場離奇詭異椭懊,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進店門氧猬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來背犯,“玉大人,你說我怎么就攤上這事盅抚∧海” “怎么了?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵妄均,是天一觀的道長柱锹。 經(jīng)常有香客問我,道長丰包,這世上最難降的妖魔是什么禁熏? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮邑彪,結(jié)果婚禮上瞧毙,老公的妹妹穿的比我還像新娘。我一直安慰自己寄症,他們只是感情好宙彪,可當(dāng)我...
    茶點故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著有巧,像睡著了一般释漆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上篮迎,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天男图,我揣著相機與錄音,去河邊找鬼柑潦。 笑死,一個胖子當(dāng)著我的面吹牛峻凫,可吹牛的內(nèi)容都是我干的渗鬼。 我是一名探鬼主播,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼荧琼,長吁一口氣:“原來是場噩夢啊……” “哼譬胎!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起命锄,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤堰乔,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后脐恩,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體镐侯,經(jīng)...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年驶冒,在試婚紗的時候發(fā)現(xiàn)自己被綠了苟翻。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片韵卤。...
    茶點故事閱讀 38,809評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖崇猫,靈堂內(nèi)的尸體忽然破棺而出沈条,到底是詐尸還是另有隱情,我是刑警寧澤诅炉,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布蜡歹,位于F島的核電站,受9級特大地震影響涕烧,放射性物質(zhì)發(fā)生泄漏月而。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一澈魄、第九天 我趴在偏房一處隱蔽的房頂上張望景鼠。 院中可真熱鬧,春花似錦痹扇、人聲如沸铛漓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽浓恶。三九已至,卻和暖如春结笨,著一層夾襖步出監(jiān)牢的瞬間包晰,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工炕吸, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留伐憾,地道東北人。 一個月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓赫模,卻偏偏與公主長得像树肃,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子瀑罗,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,724評論 2 351

推薦閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法胸嘴,類相關(guān)的語法,內(nèi)部類的語法斩祭,繼承相關(guān)的語法劣像,異常的語法,線程的語...
    子非魚_t_閱讀 31,602評論 18 399
  • Java8張圖 11摧玫、字符串不變性 12耳奕、equals()方法、hashCode()方法的區(qū)別 13、...
    Miley_MOJIE閱讀 3,697評論 0 11
  • 一:java概述: 1吮铭,JDK:Java Development Kit时迫,java的開發(fā)和運行環(huán)境,java的開發(fā)...
    慕容小偉閱讀 1,778評論 0 10
  • 音頻中的四種人際關(guān)系讓我想到薩提亞的四種溝通模式:超理智谓晌,指責(zé)掠拳,討好,打岔纸肉。 這四種溝通模式就...
    聽故事的燕子閱讀 330評論 0 2
  • 不覺間已快三十了溺欧,從畢業(yè)到現(xiàn)在一直在焦慮中工作,經(jīng)常反思自己的能力提高了嗎柏肪,將來如果出去了自己能做什么姐刁,自己的一技...
    eelq閱讀 300評論 0 0