Java多線程同步Synchronized使用分析

同步的概念:

同步分為 同步方法 和 同步塊 兩種方式揪漩。

鎖定的內(nèi)容分為 鎖定類的某個特定實例 和 鎖定類對象(類的所有實例)

變量分為 實例變量(不帶static的變量) 和 類變量(帶static的變量)

使用同步的原因

1. 在系統(tǒng)中對訪類要使用多線程進行訪問;

2. 在該類中有 類變量, 或者是 在類的方法中有訪問 公共資源(如一個外部文件的讀寫)措近。

同步鎖鎖定的內(nèi)容是什么?

無論你將Synchronized加在方法前還是加在一個變量前熊昌,其鎖定的都是一個 類對象。 每一個對象都只有一個鎖與之相關(guān)聯(lián)憨颠。

下例中分情況的列舉各種情況下的同步效果

1. Synchronized 加在方法上胳徽, (同步方法,鎖定類實例)

Java代碼

publicclassDemo1?{

publicsynchronizedvoidm1(){

//...............

}

publicvoidm2(){

//............

synchronized(this){

//.........

}

//........

}

}

這兩種寫法的效果是一樣的爽彤,鎖定的都是類實例對象养盗。如果有一個 類實例對象: demo = new Demo1(),另外有兩個線程: thread1适篙,thread2往核,都調(diào)用了demo 對象,那么嚷节,在同一時間聂儒,如果 thread1調(diào)用了demo.m1()虎锚,則thread2在該時間內(nèi)不能訪問demo.m1() 和 demo.m2(); 因為thread1把demo這個對象的鎖使用了,所以無法分給其它線程使用

但是衩婚,如果thread1調(diào)用 demo1.m1(), thread2調(diào)用 demo2.m1(), 則可以同時進行窜护,因為它們調(diào)用的是不同的Demo1類對象實例。

2. Synchronized 加在變量上谅猾, (同步塊柄慰,鎖定類實例)

Java代碼

publicclassDemo2?{

Object?a?=newObject();

Object?b?=newObject();

publicvoidm1(){

//............

synchronized(a){

//.........

}

//........

}

publicvoidm2(){

//............

synchronized(b){

//.........

}

//........

}

}

這種情況下,是實現(xiàn)代碼塊鎖定税娜,鎖定的對象是 變量 a 或 b; (注意坐搔,a 、b 都是非static 的)如果有一個 類實例對象: demo = new Demo2()敬矩,另外有兩個線程: thread1概行,thread2,都調(diào)用了demo 對象弧岳,那么凳忙,在同一時間,如果 thread1調(diào)用了demo.m1()禽炬,則thread2在該時間內(nèi)可以訪問demo.m2();但不能訪問 demo.m1() 的同步塊涧卵, 因為a被 thread1鎖定了。

3. Synchronized 鎖定的是 類變量 腹尖,即static 變量(可能是屬性柳恐,可能是方法)(鎖定類對象)

Java代碼

publicclassDemo3?{

staticObject?o?=newObject();

publicstaticsynchronizedvoidm1()?{

//....

}

publicstaticvoidm2()?{

//...

synchronized(Demo3.class)?{

//.....

}

//.....

}

publicstaticvoidm3()?{

//..........

try{

synchronized(Class.forName("Demo3"))?{

//............

}

}catch(ClassNotFoundException?ex)?{

}

//.............

}

publicstaticvoidm4()?{

//............

synchronized(o){

//........

}

//..........

}

}

以上4個方法中實現(xiàn)的效果都是一樣的,其鎖定的對象都是類Demo3热幔,而不是類實例對象 乐设,即在多線程中,其共享的資源是屬于類的绎巨,而不是屬于類對象的近尚。在這種情況下,如果thread1 訪問了這4個方法中的任何一個场勤, 在同一時間內(nèi)其它的線程都不能訪問 這4個方法戈锻。

4. 類的方法中訪問了多線程共同的資源, 且該資源是可變的,這種情況下也是需要進行同步的

Java代碼

publicclassDemo4?{

staticString?path?="file?path";

publicvoidreadConfiFile()?{

synchronized(path)?{

//?讀取該path指定的文件和媳。

}

}

publicvoidwriteConfiFile()?{

synchronized(path)?{

//寫信息到該path指定的文件格遭。

}

}

}

這種情況下,必須鎖定為 類變量窗价,而不能進行鎖定類實例對象如庭,因為這是變象的一種類資源共享叹卷,而不是類實例對象資源共享撼港。

線程坪它,成也其,敗也其帝牡,用好了可以提升性能往毡,用不好則會使系統(tǒng)后患無窮。

PS: 進行線程同步需要很大的系統(tǒng)開銷靶溜, 所以开瞭,在使用時,如果不是必須的罩息,則盡量不使用同步功能嗤详。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市瓷炮,隨后出現(xiàn)的幾起案子葱色,更是在濱河造成了極大的恐慌,老刑警劉巖娘香,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件苍狰,死亡現(xiàn)場離奇詭異,居然都是意外死亡烘绽,警方通過查閱死者的電腦和手機淋昭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來安接,“玉大人翔忽,你說我怎么就攤上這事『斩危” “怎么了呀打?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長糯笙。 經(jīng)常有香客問我贬丛,道長,這世上最難降的妖魔是什么给涕? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任豺憔,我火速辦了婚禮,結(jié)果婚禮上够庙,老公的妹妹穿的比我還像新娘恭应。我一直安慰自己,他們只是感情好耘眨,可當(dāng)我...
    茶點故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布昼榛。 她就那樣靜靜地躺著,像睡著了一般剔难。 火紅的嫁衣襯著肌膚如雪胆屿。 梳的紋絲不亂的頭發(fā)上奥喻,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天,我揣著相機與錄音非迹,去河邊找鬼环鲤。 笑死,一個胖子當(dāng)著我的面吹牛憎兽,可吹牛的內(nèi)容都是我干的冷离。 我是一名探鬼主播,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼纯命,長吁一口氣:“原來是場噩夢啊……” “哼西剥!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起亿汞,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤蔫耽,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后留夜,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體匙铡,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年碍粥,在試婚紗的時候發(fā)現(xiàn)自己被綠了鳖眼。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡嚼摩,死狀恐怖钦讳,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情枕面,我是刑警寧澤愿卒,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站潮秘,受9級特大地震影響琼开,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜枕荞,卻給世界環(huán)境...
    茶點故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一柜候、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧躏精,春花似錦渣刷、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春碌嘀,著一層夾襖步出監(jiān)牢的瞬間碾篡,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工筏餐, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人牡拇。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓魁瞪,卻偏偏與公主長得像,于是被迫代替她去往敵國和親惠呼。 傳聞我的和親對象是個殘疾皇子导俘,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,092評論 2 355

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

  • 本文主要講了java中多線程的使用方法、線程同步剔蹋、線程數(shù)據(jù)傳遞旅薄、線程狀態(tài)及相應(yīng)的一些線程函數(shù)用法、概述等泣崩。 首先講...
    李欣陽閱讀 2,456評論 1 15
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法少梁,類相關(guān)的語法,內(nèi)部類的語法矫付,繼承相關(guān)的語法凯沪,異常的語法,線程的語...
    子非魚_t_閱讀 31,645評論 18 399
  • Java多線程學(xué)習(xí) [-] 一擴展javalangThread類 二實現(xiàn)javalangRunnable接口 三T...
    影馳閱讀 2,959評論 1 18
  • 寫在前面的話: 這篇博客是我從這里“轉(zhuǎn)載”的买优,為什么轉(zhuǎn)載兩個字加“”呢妨马?因為這絕不是簡單的復(fù)制粘貼,我花了五六個小...
    SmartSean閱讀 4,732評論 12 45
  • 我們在修行的過程中杀赢,總是苦于沒有老師的指導(dǎo)烘跺。實際上,我們每天詠念的《心經(jīng)》脂崔,就是我們修行滤淳、生活最好的指導(dǎo),最親切的...
    旺財楊子閱讀 2,205評論 2 50