java關(guān)鍵字:syncronized this

前言

看到一個關(guān)于syncronized的題蠢箩,回想了一下syncronized的用法,感覺好多又忘記了事甜,這次把整個syncronized的用法總一次完整的總結(jié)谬泌,以后面試的時候應(yīng)該沒啥問題了。全篇如有不正確逻谦,請指出呵萨,謝謝,本文案例都是測試通過跨跨。

synchronized是Java中的關(guān)鍵字潮峦,是一種同步鎖。它修飾的對象有以下幾種:

  1. 修飾一個代碼塊勇婴,被修飾的代碼塊稱為同步語句塊忱嘹,其作用的范圍是大括號{}括起來的代碼,作用的對象是調(diào)用這個代碼塊的對象耕渴;
  2. 修飾一個方法拘悦,被修飾的方法稱為同步方法,其作用的范圍是整個方法橱脸,作用的對象是調(diào)用這個方法的對象础米;
  3. 修改一個靜態(tài)的方法,其作用的范圍是整個靜態(tài)方法添诉,作用的對象是這個類的所有對象屁桑;
  4. 修改一個類,其作用的范圍是synchronized后面括號括起來的部分栏赴,作用主的對象是這個類的所有對象蘑斧。

修飾代碼塊,簡單寫法就是

syncrionzed(this){
    ...
}
this是什么?

這里的this是指對象了還是指實例了竖瘾?很多人都應(yīng)該考慮過這個問題沟突,下面通過代碼解釋this到底是指什么

package com.company.syncronized;

/**
 * Created by wxwall on 2017/6/6.
 */
class SyncronizedDemo implements Runnable{
    public static void main(String[] args) {
        SyncronizedDemo demo = new SyncronizedDemo();
        System.out.println(demo.toString());
        Thread t = new Thread(demo);
        Thread t1 = new Thread(demo);
        t.start();
        t1.start();
    }

    @Override
    public void run() {
        System.out.println(this.toString());
    }
}

輸出結(jié)果:

com.company.syncronized.SyncronizedDemo@1a758cb
com.company.syncronized.SyncronizedDemo@1a758cb
com.company.syncronized.SyncronizedDemo@1a758cb

這里可以看出this是指這個對象的實例,這點很重要捕传,因為synchronized括號里具體是指對象還是指實例惠拭,直接影響代碼結(jié)果。

單個實例庸论,一個時間內(nèi)只能有一個線程得到執(zhí)行
Paste_Image.png

當(dāng)線程進(jìn)入synchronized代碼塊時求橄,其他獲得this這個實例的所有線程都是MONITOR狀態(tài),只能等到Thread-0程序走出代碼塊時葡公,釋放鎖后罐农,其他線程通過CPU調(diào)試分配鎖資源才能繼續(xù)執(zhí)行,這點依賴系統(tǒng)催什,程序是無法控制的涵亏。

多個實例,代碼塊將失效,一個時間內(nèi)有多個線程得到執(zhí)行
Paste_Image.png

執(zhí)行結(jié)果會出現(xiàn)如下:

com.company.syncronized.SyncronizedDemo@1ff7a1e
com.company.syncronized.SyncronizedDemo@105738
Thread-0
Thread-1

這個時候如果想有多個實例蒲凶,又有多個線程想要執(zhí)行這個同步代碼塊怎么辦了气筋,這個時候,就要把synchronized(this)里的this對象換掉旋圆,換成對象宠默。

Paste_Image.png

這里,如果換成類對象灵巧,這個代碼塊就無論有多少個實例搀矫,只要有線程來,就得一個一個來刻肄,所以瓤球,一開始就分清楚什么是括號里的加鎖的是對象還是加鎖實例,是不同的敏弃。

是不是方法體上加了synchronized就會在同一個時間只有一個線程執(zhí)行卦羡?

看下面的代碼,是不是沒有在同一個時間只有一個線程執(zhí)行

Paste_Image.png

原因是兩個線程都new出來了個Test對象麦到,兩個線程其實是分別執(zhí)行自己的實例咸这,所以要避免這種問題出現(xiàn)時检眯,最好打印出來this關(guān)鍵字到底是指哪個對象虚汛。

Thread-0
Thread-1
com.company.syncronized.Test@15212bc
com.company.syncronized.Test@86fe26

這個時候痛垛,如果把要同步的對象改成共享變量就會按我們預(yù)定的想法走,結(jié)果如下

Paste_Image.png
Thread-0
com.company.syncronized.Test@1bfc93a
Thread-1
com.company.syncronized.Test@1bfc93a
static synchronized 與synchronized 區(qū)別

如果要用文字說區(qū)別步清,那就是synchronized鎖對象問題要门,如果synchronized鎖的是對象,而不是實例廓啊,那與 static synchronized用法一樣欢搜,下面看例子說明

package com.company.syncronized;

/**
 * Created by wxwall on 2017/6/6.
 */
class SyncronizedDemo implements Runnable{

    public static void main(String[] args) {
        SyncronizedDemo demo = new SyncronizedDemo();
        Thread t = new Thread(demo);
        Thread t1 = new Thread(demo);
        t.start();
        t1.start();
    }
    @Override
    public void run() {
        synchronized (Test.class){
            Test.bb();
        }

    }
}
class Test {
    public static  void bb(){
        System.out.println(Thread.currentThread().getName());
    }
}

等同于

package com.company.syncronized;

/**
 * Created by wxwall on 2017/6/6.
 */
class SyncronizedDemo implements Runnable{

    public static void main(String[] args) {
        SyncronizedDemo demo = new SyncronizedDemo();
        Thread t = new Thread(demo);
        Thread t1 = new Thread(demo);
        t.start();
        t1.start();
    }
    @Override
    public void run() {
        Test.bb();
    }
}
class Test {
    public static synchronized  void bb(){
        System.out.println(Thread.currentThread().getName());
    }
}

所以,理解synchronized 最主要的點就是鎖的對象是哪個了谴轮。

鎖住對象了炒瘟,其他線程能不能進(jìn)入其他方法了?看代碼
Paste_Image.png

我們發(fā)現(xiàn)第步,如果對象加鎖了疮装,其他線程是不可以進(jìn)入這個對象的其他加了synchronized 關(guān)鍵字的方法了。但如果其他方法沒加synchronized粘都,是可以進(jìn)入的廓推。

總結(jié)

關(guān)于synchronized介紹的文章已經(jīng)很多,本文是自己分析synchronized的一些見解翩隧,也是為了完善自己關(guān)于java基礎(chǔ)篇系列的補(bǔ)充樊展,希望我用圖解調(diào)試的方法解釋問題相比直接上代碼,然后對比輸出結(jié)果來得更加簡單容易點堆生,如果能幫助到您专缠,那就很開心了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末淑仆,一起剝皮案震驚了整個濱河市涝婉,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蔗怠,老刑警劉巖墩弯,帶你破解...
    沈念sama閱讀 211,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異寞射,居然都是意外死亡最住,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,347評論 3 385
  • 文/潘曉璐 我一進(jìn)店門怠惶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來涨缚,“玉大人,你說我怎么就攤上這事策治∨海” “怎么了?”我有些...
    開封第一講書人閱讀 157,435評論 0 348
  • 文/不壞的土叔 我叫張陵通惫,是天一觀的道長茂翔。 經(jīng)常有香客問我,道長履腋,這世上最難降的妖魔是什么珊燎? 我笑而不...
    開封第一講書人閱讀 56,509評論 1 284
  • 正文 為了忘掉前任惭嚣,我火速辦了婚禮,結(jié)果婚禮上悔政,老公的妹妹穿的比我還像新娘晚吞。我一直安慰自己,他們只是感情好谋国,可當(dāng)我...
    茶點故事閱讀 65,611評論 6 386
  • 文/花漫 我一把揭開白布槽地。 她就那樣靜靜地躺著,像睡著了一般芦瘾。 火紅的嫁衣襯著肌膚如雪捌蚊。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,837評論 1 290
  • 那天近弟,我揣著相機(jī)與錄音缅糟,去河邊找鬼。 笑死祷愉,一個胖子當(dāng)著我的面吹牛溺拱,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播谣辞,決...
    沈念sama閱讀 38,987評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼迫摔,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了泥从?” 一聲冷哼從身側(cè)響起句占,我...
    開封第一講書人閱讀 37,730評論 0 267
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎躯嫉,沒想到半個月后纱烘,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,194評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡祈餐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,525評論 2 327
  • 正文 我和宋清朗相戀三年擂啥,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片帆阳。...
    茶點故事閱讀 38,664評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡哺壶,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蜒谤,到底是詐尸還是另有隱情山宾,我是刑警寧澤,帶...
    沈念sama閱讀 34,334評論 4 330
  • 正文 年R本政府宣布鳍徽,位于F島的核電站资锰,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏阶祭。R本人自食惡果不足惜绷杜,卻給世界環(huán)境...
    茶點故事閱讀 39,944評論 3 313
  • 文/蒙蒙 一直秆、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧鞭盟,春花似錦圾结、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,764評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽培他。三九已至鹃两,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間舀凛,已是汗流浹背俊扳。 一陣腳步聲響...
    開封第一講書人閱讀 31,997評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留猛遍,地道東北人馋记。 一個月前我還...
    沈念sama閱讀 46,389評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像懊烤,于是被迫代替她去往敵國和親梯醒。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,554評論 2 349

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

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法腌紧,類相關(guān)的語法茸习,內(nèi)部類的語法,繼承相關(guān)的語法壁肋,異常的語法号胚,線程的語...
    子非魚_t_閱讀 31,598評論 18 399
  • 一:java概述:1,JDK:Java Development Kit浸遗,java的開發(fā)和運(yùn)行環(huán)境猫胁,java的開發(fā)工...
    ZaneInTheSun閱讀 2,635評論 0 11
  • 從三月份找實習(xí)到現(xiàn)在,面了一些公司跛锌,掛了不少弃秆,但最終還是拿到小米、百度髓帽、阿里驾茴、京東、新浪氢卡、CVTE锈至、樂視家的研發(fā)崗...
    時芥藍(lán)閱讀 42,213評論 11 349
  • 本文出自 Eddy Wiki ,轉(zhuǎn)載請注明出處:http://eddy.wiki/interview-java.h...
    eddy_wiki閱讀 2,076評論 0 14
  • 開著空調(diào) 吹著涼風(fēng) 敲著鍵盤 意識到送別了金秋九月 在十月的日子里 本該穿著長褲外套 本該收起薄被涼席 我 想長安...
    遠(yuǎn)方有多遠(yuǎn)閱讀 66評論 0 0