synchronized關(guān)鍵字詳解

synchronized簡(jiǎn)介

synchronized方法控制對(duì)類對(duì)象方法的訪問(wèn)幔睬,每個(gè)類對(duì)象都對(duì)應(yīng)一把鎖歇终,每個(gè)synchronized 方法都必須獲得該方法所屬對(duì)象的鎖方能執(zhí)行惰赋,否則所屬線程阻塞邑狸,方法一旦執(zhí)行坪郭,就獨(dú)占該對(duì)象鎖赊颠,直到從該方法返回時(shí)才將鎖釋放,此后被阻塞的線程方能獲得該鎖瑰剃,重新進(jìn)入可執(zhí)行狀態(tài)齿诉。這種機(jī)制確保了同一時(shí)刻對(duì)于每一個(gè)對(duì)象實(shí)例,其所有聲明為 synchronized 的實(shí)例函數(shù)中至多只有一個(gè)處于可執(zhí)行狀態(tài)晌姚,從而有效避免了類成員變量的訪問(wèn)沖突粤剧。注意,其它非synchronized的函數(shù)仍可被其它線程同時(shí)訪問(wèn)挥唠。

synchronized基本用法

  • 修飾普通方法
public synchronized void inc(int i)   {
    i++;
}
  • 修飾靜態(tài)方法
public static synchronized void inc(int i)   {
    i++;
}
  • 修飾代碼塊
public void inc(int i) {
    synchronized(this) {
        i++;
    }
}

哪個(gè)對(duì)象才是鎖抵恋??宝磨?

首先看兩個(gè)例子:

class Foo extends Thread {
    private int val;

    public Foo(int v) {
        val = v;
    }

    public synchronized void printVal(int v) {
        while (true) {
            System.out.println(v);
        }
    }

    public void run() {
        printVal(val);
    }
}

public class SyncTest {
    public static void main(String args[]) {
        Foo f1 = new Foo(1);
        f1.start();
        Foo f2 = new Foo(3);
        f2.start();
    }
}
//運(yùn)行結(jié)果:
1
1
3
3
.....//1和3循環(huán)出現(xiàn)
修改為:
class Foo extends Thread {
    private int val;

    public Foo(int v) {
        val = v;
    }

  
    public void printVal(int v) {
        synchronized(Foo.class) {
            while(true)
                System.out.println(v);
        }
    }

    public void run() {
        printVal(val);
    }
}
//運(yùn)行結(jié)果:
1
1
1
......//1循環(huán)出現(xiàn)弧关,沒有出現(xiàn)3

總結(jié):同一時(shí)刻對(duì)于每一個(gè)對(duì)象實(shí)例,其所有聲明為 synchronized 的實(shí)例函數(shù)中至多只有一個(gè)處于可執(zhí)行狀態(tài)唤锉。第一個(gè)例子有兩個(gè)實(shí)例對(duì)象梯醒,所以他們都可以訪問(wèn)printVal方法;第二個(gè)例子只有一個(gè)類對(duì)象腌紧,所以只有一個(gè)實(shí)例可以訪問(wèn)printVal方法。

synchronized特點(diǎn)

  • 可重入鎖

這個(gè)特性主要是針對(duì)當(dāng)前線程而言的畜隶,可重入即是自己可以再次獲得自己的內(nèi)部鎖壁肋,在嘗試獲取對(duì)象鎖時(shí),如果當(dāng)前線程已經(jīng)擁有了此對(duì)象的鎖籽慢,則把鎖的計(jì)數(shù)器加一浸遗,在釋放鎖時(shí)則對(duì)應(yīng)地減一,當(dāng)鎖計(jì)數(shù)器為0時(shí)表示鎖完全被釋放箱亿,此時(shí)其他線程可對(duì)其加鎖跛锌。可重入可以避免死鎖(線程自己鎖死自己)届惋。

  • 非公平鎖

非公平主要表現(xiàn)在獲取鎖的行為上髓帽,并非是按照申請(qǐng)鎖的時(shí)間前后給等待線程分配鎖的,每當(dāng)鎖被釋放后脑豹,任何一個(gè)線程都有機(jī)會(huì)競(jìng)爭(zhēng)到鎖郑藏,這樣做的目的是為了提高執(zhí)行性能,當(dāng)然也會(huì)產(chǎn)生線程饑餓現(xiàn)象瘩欺。

  • 不可中斷性

在所有等待的線程中必盖,你們唯一能做的就是等拌牲,而實(shí)際情況可能是有些任務(wù)等了足夠久了,我要取消此任務(wù)去干別的事情歌粥,此時(shí)synchronized是無(wú)法幫你實(shí)現(xiàn)的塌忽,它把所有實(shí)現(xiàn)機(jī)制都交給了JVM,提供了方便的同時(shí)也體現(xiàn)出了自己的局限性失驶。

  • 只能綁定一個(gè)條件

鎖對(duì)象的wait()和notify()或notifyAll()方法可以實(shí)現(xiàn)一個(gè)隱含的條件土居,如果要和多于一個(gè)條件關(guān)聯(lián)時(shí),只能再加一個(gè)額外的鎖突勇。

  • 主動(dòng)釋放鎖

線程進(jìn)入同步代碼塊或方法的時(shí)候會(huì)自動(dòng)獲得該鎖装盯,在退出同步代碼塊或方法時(shí)會(huì)釋放該鎖。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末甲馋,一起剝皮案震驚了整個(gè)濱河市埂奈,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌定躏,老刑警劉巖账磺,帶你破解...
    沈念sama閱讀 216,692評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異痊远,居然都是意外死亡垮抗,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門碧聪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)冒版,“玉大人,你說(shuō)我怎么就攤上這事逞姿〈俏耍” “怎么了?”我有些...
    開封第一講書人閱讀 162,995評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵滞造,是天一觀的道長(zhǎng)续室。 經(jīng)常有香客問(wèn)我,道長(zhǎng)谒养,這世上最難降的妖魔是什么挺狰? 我笑而不...
    開封第一講書人閱讀 58,223評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮买窟,結(jié)果婚禮上丰泊,老公的妹妹穿的比我還像新娘。我一直安慰自己始绍,他們只是感情好趁耗,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,245評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著疆虚,像睡著了一般苛败。 火紅的嫁衣襯著肌膚如雪满葛。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,208評(píng)論 1 299
  • 那天罢屈,我揣著相機(jī)與錄音嘀韧,去河邊找鬼。 笑死缠捌,一個(gè)胖子當(dāng)著我的面吹牛锄贷,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播曼月,決...
    沈念sama閱讀 40,091評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼谊却,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了哑芹?” 一聲冷哼從身側(cè)響起炎辨,我...
    開封第一講書人閱讀 38,929評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎聪姿,沒想到半個(gè)月后碴萧,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,346評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡末购,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,570評(píng)論 2 333
  • 正文 我和宋清朗相戀三年破喻,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片盟榴。...
    茶點(diǎn)故事閱讀 39,739評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡曹质,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出擎场,到底是詐尸還是另有隱情羽德,我是刑警寧澤,帶...
    沈念sama閱讀 35,437評(píng)論 5 344
  • 正文 年R本政府宣布顶籽,位于F島的核電站,受9級(jí)特大地震影響银觅,放射性物質(zhì)發(fā)生泄漏礼饱。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,037評(píng)論 3 326
  • 文/蒙蒙 一究驴、第九天 我趴在偏房一處隱蔽的房頂上張望镊绪。 院中可真熱鬧,春花似錦洒忧、人聲如沸蝴韭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,677評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)榄鉴。三九已至履磨,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間庆尘,已是汗流浹背剃诅。 一陣腳步聲響...
    開封第一講書人閱讀 32,833評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留驶忌,地道東北人矛辕。 一個(gè)月前我還...
    沈念sama閱讀 47,760評(píng)論 2 369
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像付魔,于是被迫代替她去往敵國(guó)和親聊品。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,647評(píng)論 2 354

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