java多線程控制:synchronized

在java中闺阱,如果開啟多個線程同時讀寫一個對象,會導(dǎo)致數(shù)據(jù)不正常舵变。為了保證數(shù)據(jù)的安全酣溃,我們會使用鎖來控制線程的訪問。

synchronized

synchronized纪隙,互斥鎖赊豌,當(dāng)一個線程持有鎖時,另一個線程無法持有绵咱,只有當(dāng)方法執(zhí)行完碘饼,鎖被釋放時,其他線程才有機(jī)會獲取鎖悲伶。

synchronized的使用有兩種方式:一種是用在方法上艾恼,一種是用在代碼塊上。

public synchronized void method ();

public void method () {
    synchronized(obj){
      
    }
}

當(dāng)其用在方法上時麸锉,線程調(diào)用該方法會獲取其實例的鎖钠绍,效果等同于在代碼塊上鎖住了自己的實例。

synchronized(this){
  
}

所以除非保證該方法的實例唯一花沉,或者為static修飾(static修飾時柳爽,對象鎖為改類的鎖)媳握,否則無法保證互斥。也就是說泻拦,只能互斥同一個對象鎖的線程毙芜。

wait

wait,使線程釋放當(dāng)前持有的對象鎖争拐,并進(jìn)入等待狀態(tài)腋粥,后續(xù)代碼不再執(zhí)行,其他線程可爭奪該對象鎖架曹。

notify

notify隘冲,喚醒其他因調(diào)用其對象鎖進(jìn)入wait狀態(tài)的線程。執(zhí)行完后續(xù)代碼之后釋放對象鎖绑雄。若有多個調(diào)用其對象進(jìn)入wait狀態(tài)的線程展辞,則根據(jù)系統(tǒng)的實現(xiàn),喚醒其中一個万牺。

notifyAll

notifyAll罗珍,喚醒所有其他因調(diào)用其對象鎖進(jìn)入wait狀態(tài)的線程。執(zhí)行完后續(xù)代碼之后釋放對象鎖脚粟。根據(jù)系統(tǒng)實現(xiàn)決定先喚醒哪一個覆旱。

注意

只有線程本身持有該對象鎖,才能執(zhí)行wait/notify/notifyAll方法核无,比如:

synchronized(obj){
  obj.wait();
}

不然會報異常:IllegalMonitorStateException扣唱。

死鎖

有兩個線程,分別持有兩個對象鎖团南,并且互相申請對方的對象鎖時噪沙,會發(fā)生死鎖。

比如:

synchronized(a){
  try{
    Thread.sleep(1000);
  }catch(Exception e){
    
  }
  synchronized(b){
    
  }
}


synchronized(b){
  try{
    Thread.sleep(1000);
  }catch(Exception e){
    
  }
  synchronized(a){
    
  }
}

兩個線程分別持有對象鎖a吐根、b正歼,之后互相申請對方的對象鎖b、a佑惠,這個時候因為雙方都無法釋放自己的對象鎖朋腋,同時對方無法獲取對象鎖,就會進(jìn)入鎖死BLOCKED狀態(tài)膜楷。

線程可以持有多個對象鎖旭咽,并且當(dāng)其調(diào)用wait釋放其中一個對象鎖時,其扔持有其他對象鎖赌厅。比如:

synchronized(a){
  
  synchronized(b){
    b.wait();
  }
}

當(dāng)線程調(diào)用b的對象鎖進(jìn)入等待狀態(tài)穷绵,并釋放了對象鎖b,這個時候依然保持著持有對象鎖a特愿,當(dāng)此線程被喚醒并釋放對象鎖a之前仲墨,其他線程依然無法獲取對象鎖a勾缭。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市目养,隨后出現(xiàn)的幾起案子俩由,更是在濱河造成了極大的恐慌,老刑警劉巖癌蚁,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件幻梯,死亡現(xiàn)場離奇詭異,居然都是意外死亡努释,警方通過查閱死者的電腦和手機(jī)碘梢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來伐蒂,“玉大人煞躬,你說我怎么就攤上這事∫莅睿” “怎么了恩沛?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長缕减。 經(jīng)常有香客問我复唤,道長,這世上最難降的妖魔是什么烛卧? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮妓局,結(jié)果婚禮上总放,老公的妹妹穿的比我還像新娘。我一直安慰自己好爬,他們只是感情好局雄,可當(dāng)我...
    茶點故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著存炮,像睡著了一般炬搭。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上穆桂,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天宫盔,我揣著相機(jī)與錄音,去河邊找鬼享完。 笑死灼芭,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的般又。 我是一名探鬼主播彼绷,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼巍佑,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了寄悯?” 一聲冷哼從身側(cè)響起萤衰,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎猜旬,沒想到半個月后脆栋,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡昔馋,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年筹吐,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片秘遏。...
    茶點故事閱讀 39,953評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡丘薛,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出邦危,到底是詐尸還是另有隱情洋侨,我是刑警寧澤,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布倦蚪,位于F島的核電站希坚,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏陵且。R本人自食惡果不足惜裁僧,卻給世界環(huán)境...
    茶點故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望慕购。 院中可真熱鬧聊疲,春花似錦、人聲如沸沪悲。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽殿如。三九已至贡珊,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間涉馁,已是汗流浹背门岔。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留烤送,地道東北人固歪。 一個月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親牢裳。 傳聞我的和親對象是個殘疾皇子逢防,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,901評論 2 355

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