volatile與synchronized的區(qū)別

一、volatile

  • volatile的原理
    在java中振坚,被volatile聲明的關(guān)鍵字,jvm會在翻譯的時候在cpu指令前加入lock前綴啃洋,而這個lock前綴的指令會在多核處理器下引發(fā)兩件事情呀狼。
  1. 將當(dāng)前處理器的緩存行的數(shù)據(jù)寫回到系統(tǒng)內(nèi)存。
  2. 這個寫回內(nèi)存的操作會使在其他cpu里緩存了該內(nèi)存地址的數(shù)據(jù)無效绝编,若其他線程還要讀取數(shù)據(jù)貌踏,則需要重新回到系統(tǒng)主存中取。
    當(dāng)然volatile的使用是有條件的:
  3. 對變量的寫操作不影響當(dāng)前值
  • 使用方法
public class CheesyCounter {  
    private volatile int value;  
  
    //讀操作逗堵,沒有synchronized眷昆,提高性能  
    public int getValue() {   
        return value;   
    }   
  
    //寫操作,必須synchronized亚斋。因?yàn)閤++不是原子操作  
    public synchronized int increment() {  
        return value++;  
    }  
}

synchronized

synchronized一般被稱為重量級鎖帅刊。但是jdk1.6之后對它進(jìn)行了許多優(yōu)化兄旬,減少了獲得鎖和釋放鎖的性能消耗录肯。

  • java中synchronized加鎖的三種形式
  1. 對于普通同步方法栏饮,鎖的為當(dāng)前實(shí)例對象
  2. 對于靜態(tài)同步方法,鎖的是當(dāng)前類的Class對象
  3. 對于同步塊內(nèi)的方法境蔼,鎖的為括號內(nèi)配置的對象
public class ThreeLock {
    //鎖當(dāng)前對象
    synchronized public void print() {
        System.out.println(System.currentTimeMillis());
    }
    //同步塊鎖當(dāng)前對象
    public void lock1() {
        synchronized (this) {
            System.out.println(System.currentTimeMillis());
        }
    }
    //同步快鎖當(dāng)前類的Class對象
    public void lock2() {
        synchronized (ThreeLock.class) {
            System.out.println(System.currentTimeMillis());
        }
    }
//    靜態(tài)方法鎖當(dāng)前類的class對象
    public synchronized static void lock3() {
        
    }
}

  • synchronized的原理
    被synchronized修飾的對象欧穴,每個對象都有一個Monitor對象泵殴,獲得鎖時,調(diào)用monitorenter笑诅,退出鎖時使用monitorexit。因?yàn)閟ynchronized是可重入鎖弦叶,我們可以理解為獲得鎖時妇多,monitor++,退出鎖時monitor--立莉,當(dāng)為0時七问,為無鎖狀態(tài)。

鎖的升級與對比

java1.6 為了減少獲得鎖和釋放鎖的性能消耗械巡,引入了偏向鎖輕量級鎖,在jdk1.6中有勾,鎖一共有4種狀態(tài):無鎖狀態(tài)葛账、偏向鎖狀態(tài)、輕量級鎖狀態(tài)菲宴、重量級鎖狀態(tài)

  • 偏向鎖
    HotSpotjvm的作者經(jīng)過研究發(fā)現(xiàn)趋急,大多數(shù)情況下,鎖不僅不存在多線程競爭谣蠢,而且總是由同
    一線程多次獲得,為了讓線程獲得鎖的代價(jià)更低而引入了偏向鎖眉踱。當(dāng)一個線程訪問同步塊并
    獲取鎖時,會在對象頭和棧幀中的鎖記錄里存儲鎖偏向的線程ID册烈,以后該線程在進(jìn)入和退出
    同步塊時不需要進(jìn)行CAS操作來加鎖和解鎖婿禽,只需簡單地測試一下對象頭的Mark Word里是否
    存儲著指向當(dāng)前線程的偏向鎖
    。如果測試成功淀零,表示線程已經(jīng)獲得了鎖膛壹。如果測試失敗,則需
    要再測試一下Mark Word中偏向鎖的標(biāo)識是否設(shè)置成1(表示當(dāng)前是偏向鎖):如果沒有設(shè)置哀卫,則
    使用CAS競爭鎖撬槽;如果設(shè)置了,則嘗試使用CAS將對象頭的偏向鎖指向當(dāng)前線程共啃。
  • 輕量級鎖
    輕量級鎖原理非常簡單暂题,如果持有鎖的線程能在很短時間內(nèi)釋放鎖資源,那么那些等待競爭鎖的線程就不需要做內(nèi)核態(tài)和用戶態(tài)之間的切換進(jìn)入阻塞掛起狀態(tài)薪者,它們只需要等一等(自旋)言津,等持有鎖的線程釋放鎖后即可立即獲取鎖,這樣就避免用戶線程和內(nèi)核的切換的消耗悬槽。
    線程在執(zhí)行同步塊之前,JVM會先在當(dāng)前線程的棧楨中創(chuàng)建用于存儲鎖記錄的空間蓬坡,并
    將對象頭中的Mark Word復(fù)制到鎖記錄中,官方稱為Displaced Mark Word萨赁。然后線程嘗試使用
    CAS將對象頭中的Mark Word替換為指向鎖記錄的指針兆龙。如果成功,當(dāng)前線程獲得鎖,如果失
    敗臣缀,表示其他線程競爭鎖,當(dāng)前線程便嘗試使用自旋來獲取鎖计寇。
  • 重量級鎖
    使用監(jiān)視器鎖來實(shí)現(xiàn)脂倦,底層調(diào)用的是操作系統(tǒng)的互斥鎖(mutexLock),系統(tǒng)檢查到鎖是重量級鎖之后蝶押,會把等待想要獲得鎖的線程進(jìn)行阻塞火欧,被阻塞的線程不會消耗cup。但是阻塞或者喚醒一個線程時赶盔,都需要操作系統(tǒng)來幫忙榆浓,這就需要從用戶態(tài)轉(zhuǎn)換到內(nèi)核態(tài),而轉(zhuǎn)換狀態(tài)是需要消耗很多時間的烘浦,有可能比用戶執(zhí)行代碼的時間還要長萍鲸。

https://www.cnblogs.com/kubidemanong/p/9520071.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末猿推,一起剝皮案震驚了整個濱河市捌肴,隨后出現(xiàn)的幾起案子藕咏,更是在濱河造成了極大的恐慌,老刑警劉巖孽查,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件盲再,死亡現(xiàn)場離奇詭異,居然都是意外死亡贷揽,警方通過查閱死者的電腦和手機(jī)梦碗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進(jìn)店門洪规,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人斩例,你說我怎么就攤上這事∧埽” “怎么了晶乔?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵正罢,是天一觀的道長。 經(jīng)常有香客問我翻具,道長裆泳,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任运提,我火速辦了婚禮,結(jié)果婚禮上民泵,老公的妹妹穿的比我還像新娘。我一直安慰自己胁编,他們只是感情好鳞尔,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布寥假。 她就那樣靜靜地躺著,像睡著了一般昧旨。 火紅的嫁衣襯著肌膚如雪兔沃。 梳的紋絲不亂的頭發(fā)上级及,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天,我揣著相機(jī)與錄音怕吴,去河邊找鬼县踢。 笑死,一個胖子當(dāng)著我的面吹牛议经,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播谴返,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼煞肾,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了嗓袱?” 一聲冷哼從身側(cè)響起籍救,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎渠抹,沒想到半個月后蝙昙,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體闪萄,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年耸黑,在試婚紗的時候發(fā)現(xiàn)自己被綠了桃煎。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片大刊。...
    茶點(diǎn)故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡为迈,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出缺菌,到底是詐尸還是另有隱情葫辐,我是刑警寧澤,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布伴郁,位于F島的核電站耿战,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏焊傅。R本人自食惡果不足惜剂陡,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望狐胎。 院中可真熱鬧鸭栖,春花似錦、人聲如沸握巢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽暴浦。三九已至溅话,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間歌焦,已是汗流浹背飞几。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留独撇,地道東北人循狰。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像券勺,于是被迫代替她去往敵國和親绪钥。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評論 2 355

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