JAVA多線程Synchronized

? ? ? ? 造成線程安全問題的原因有兩個松蒜?線程數(shù)據(jù)共享。多線程同時操作共享數(shù)據(jù)已旧。在JAVA中Synchronized可以保證統(tǒng)一時刻秸苗,只有一個線程執(zhí)行某個方法或者執(zhí)行某個代碼塊;Synchronized可以保證數(shù)據(jù)的可見性运褪。Synchronizeds是互斥鎖惊楼。

一、Synchronized的三種使用方式

1秸讹、修飾實例方法檀咙,作用于當前實例加鎖,進入同步代碼前要獲得當前實例鎖璃诀。

2弧可、修飾靜態(tài)方法,作用于當前類對象鎖文虏,進入同步代碼前要獲取當前類對象鎖侣诺。

3殖演、修飾代碼塊,指定加鎖對象年鸳,對給定對象加鎖趴久,進入同步代碼塊前要獲得給定對象的鎖

1.1 Synchronized 作用于實例方法

圖1 作用于方法塊

????????此時我們應(yīng)該注意到synchronized修飾的是實例方法add搔确,在這樣的情況下彼棍,當前線程的鎖便是實例對象instance,注意Java中的線程同步鎖可以是任意對象膳算。當一個線程正在訪問一個對象的synchronized方法座硕,其他線程必須等待該線程結(jié)束,才能獲取到訪問權(quán)限涕蜂。

? ? ? ? 如果線程 ThreadA 訪問實例對象 ObjectA的 synchronized 方法 add华匾。另一個線程 ThreadB 需要訪問實例對象 ObjectB 的 synchronized 方法 add,因為兩個實例對象鎖并不同相同机隙,所有可用同時訪問蜘拉。此時如果兩個線程訪問了共享變量,那么會出現(xiàn)數(shù)據(jù)不一致的情況有鹿。如下程序旭旭,雖然有同步方法,但是還是會出現(xiàn)不一致情況葱跋。

如圖1中的類main方法改如下:

public static void main(String [] args) throws InterruptedException {

? ? ?SynchronizedClass instance = new SynchronizedClass();

? ? ?SynchronizedClass instance1 = new SynchronizedClass();

? ? ?Thread t1 = new Thread(instance);?

? ? ?Thread t2 = new Thread(instance1);?

? ? ? t1.start(); t2.start(); t1.join(); t2.join();?

? ? ? System.out.println(i);??

}

1.2 Synchronized 作用于靜態(tài)方法

? ? ? ? 一個線程A調(diào)用一個實例對象的非static synchronized方法持寄,而線程B需要調(diào)用這個實例對象所屬類的靜態(tài) synchronized方法,是允許的娱俺,不會發(fā)生互斥現(xiàn)象稍味。因為訪問靜態(tài) synchronized 方法占用的鎖是當前類的class對象,而訪問非靜態(tài) synchronized 方法占用的鎖是當前實例對象鎖荠卷。static synchronized所有對象之間是互斥的仲闽。

圖2 靜態(tài)方法同步

1.3 Synchronized 同步代碼塊

代碼同步塊,synchronized在某個方法內(nèi)的代碼塊上僵朗;synchronized作用的對象是一個今天對象。這樣可以保證在靜態(tài)同步塊屑彻。

圖三代碼同步塊

二验庙、可重入鎖

如下代碼塊,調(diào)用方法methodB時社牲,獲得了鎖粪薛,在執(zhí)行methodB時,調(diào)用方法methodA時搏恤,methodA也有代碼塊违寿,所有會自動會methodA的鎖湃交。這就是可重入鎖。

public synchronized methodA(){

? ? System.out.println("methodA");

}

public void methodB(){

? ? sychronized(this){

? ? ? ? System.out.println("methodB");

? ? ? ? methodA()

????}

}

三藤巢、線程中斷和喚醒

? ? ? ? 等待喚醒指的是notify/notifyAll和wait方法搞莺,在使用這3個方法時,必須處于synchronized代碼塊或者synchronized方法中掂咒,否則就會拋出IllegalMonitorStateException異常才沧,這是因為調(diào)用這幾個方法前必須拿到當前對象的監(jiān)視器monitor對象,也就是說notify/notifyAll和wait方法依賴于monitor對象绍刮,monitor 存在于對象頭的Mark Word 中(存儲monitor引用指針)温圆,而synchronized關(guān)鍵字可以獲取 monitor ,這也就是為什么notify/notifyAll和wait方法必須在synchronized代碼塊或者synchronized方法調(diào)用的原因孩革。

? ? ? ?wait方法將會釋放當前持有的監(jiān)視器鎖(monitor)岁歉,直到有線程調(diào)用notify/notifyAll方法后方能繼續(xù)執(zhí)行;而sleep方法只讓線程休眠并不釋放鎖膝蜈。

? ? ? ? 同時notify/notifyAll方法調(diào)用后锅移,并不會馬上釋放監(jiān)視器鎖,而是在相應(yīng)的synchronized(){}/synchronized方法執(zhí)行結(jié)束后才自動釋放鎖彬檀。

參考

http://www.reibang.com/p/7ddb0956590c

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末帆啃,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子窍帝,更是在濱河造成了極大的恐慌努潘,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件坤学,死亡現(xiàn)場離奇詭異疯坤,居然都是意外死亡,警方通過查閱死者的電腦和手機深浮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進店門压怠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人飞苇,你說我怎么就攤上這事菌瘫。” “怎么了布卡?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵雨让,是天一觀的道長。 經(jīng)常有香客問我忿等,道長栖忠,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮庵寞,結(jié)果婚禮上狸相,老公的妹妹穿的比我還像新娘。我一直安慰自己捐川,他們只是感情好脓鹃,可當我...
    茶點故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著属拾,像睡著了一般将谊。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上渐白,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天尊浓,我揣著相機與錄音,去河邊找鬼纯衍。 笑死栋齿,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的襟诸。 我是一名探鬼主播瓦堵,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼歌亲!你這毒婦竟也來了菇用?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤陷揪,失蹤者是張志新(化名)和其女友劉穎惋鸥,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體悍缠,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡卦绣,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了飞蚓。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片滤港。...
    茶點故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖趴拧,靈堂內(nèi)的尸體忽然破棺而出溅漾,到底是詐尸還是另有隱情,我是刑警寧澤著榴,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布樟凄,位于F島的核電站,受9級特大地震影響兄渺,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一挂谍、第九天 我趴在偏房一處隱蔽的房頂上張望叔壤。 院中可真熱鬧,春花似錦口叙、人聲如沸炼绘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽俺亮。三九已至,卻和暖如春疟呐,著一層夾襖步出監(jiān)牢的瞬間脚曾,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工启具, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留本讥,地道東北人。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓鲁冯,卻偏偏與公主長得像拷沸,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子薯演,可洞房花燭夜當晚...
    茶點故事閱讀 44,864評論 2 354

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