多線程-JMM,volatile,synchronized

程序產(chǎn)生異常杭措,鎖就會被釋放拳话。
原子性:某個操作是不可分割的珍剑。在一個線程進行對代碼塊原子操作的時候钓辆,其他的線程必須等待該線程完成才能進行操作缕溉。
可見性:當一個線程對某個值進行修改的時候考传,其他線程得到的也是剛剛被修改過的最新的值。
volatile保證了變量的可見性证鸥,但是并不保證其原子性僚楞。
當線程修改了變量的時候勤晚,這個變量會被立刻寫回內(nèi)存,
而其他變量在使用這個變量的時候泉褐,直接從內(nèi)存里面讀取赐写,從而保證其他線程在使用這個變量的時候拿到的是最新的數(shù)據(jù)。

synchronized膜赃,保證了原子性以及可見性挺邀。除此之外,synchronized還是可重入鎖跳座。
可重入鎖的基本理解:
可重入就是說某個線程已經(jīng)獲得某個鎖端铛,可以再次獲取鎖而不會出現(xiàn)死鎖。加鎖方法之間相互調(diào)用或者存在繼承關(guān)系的調(diào)用時會用到這個概念疲眷。

public class demo3 {
    public synchronized void m1()
    {
        this.m2();//此時該對象已經(jīng)獲取到了鎖禾蚕,但是調(diào)用m2時需要再次獲得鎖,如果不支持可重入的話就會發(fā)生死鎖現(xiàn)象
        System.out.println("m1");
    }
    public synchronized void m2()
    {
        System.out.println("m2");
    }

    public static void main(String[] args) {
        demo3 d=new demo3();
        new Thread(()->d.m1()).start();
    }
}

鎖升級機制:
synchronized在jdk1.6之前是重量級鎖狂丝,依靠于操作系統(tǒng)實現(xiàn)换淆,效率低。

阻塞或喚醒一個Java線程需要操作系統(tǒng)切換CPU狀態(tài)來完成几颜,這種狀態(tài)轉(zhuǎn)換需要耗費處理器時間产舞。如果同步代碼塊中的內(nèi)容過于簡單,狀態(tài)轉(zhuǎn)換消耗的時間有可能比用戶代碼執(zhí)行的時間還要長菠剩。

java通過鎖升級機制解決這個問題易猫。
偏向鎖---》自旋鎖--》重量級鎖

  • 偏向鎖:一段同步代碼一直被一個線程所訪問,那么該線程會自動獲取鎖具壮,降低獲取鎖的代價准颓。在大多數(shù)情況下,鎖總是由同一線程多次獲得棺妓,不存在多線程競爭攘已,所以出現(xiàn)了偏向鎖。其目標就是在只有一個線程執(zhí)行同步代碼塊時能夠提高性能怜跑,以后該線程在進入和退出同步塊時不需要進行CAS操作來加鎖和解鎖样勃。
  • 自旋鎖:當鎖處于偏向鎖的狀態(tài),出現(xiàn)了其他線程想要獲取這個鎖性芬,此時鎖的狀態(tài)會變?yōu)樽孕i峡眶,第二個線程會處于自旋狀態(tài)等待正在占有鎖的進程,不需要再被掛起處于阻塞狀態(tài)(不需要做內(nèi)核態(tài)和用戶態(tài)之間的切換)植锉。
  • 重量級鎖:若當前只有一個等待線程辫樱,則該線程通過自旋進行等待。但是當自旋超過一定的次數(shù)俊庇,或者一個線程在持有鎖狮暑,又有大量線程想持有這個鎖鸡挠,此時CPU的資源會被過多浪費,自旋鎖會轉(zhuǎn)變?yōu)橹亓考夋i搬男,將所有沒有申請到該鎖的線程阻塞掛起拣展。

JMM-java內(nèi)存模型

示意圖

一個線程如果要讀取主內(nèi)存中的變量,首先要從主內(nèi)存中復制一個副本到線程專屬的工作內(nèi)存中缔逛,修改過后將工作內(nèi)存中的變量覆蓋到主內(nèi)存中瞎惫,就完成了對主內(nèi)存中數(shù)據(jù)的修改。當多個線程訪問同一個變量的時候译株,某一個線程修改了之后瓜喇,還沒有進行覆蓋,另一個線程就又訪問了這個變量歉糜,此時數(shù)據(jù)就沒有同步乘寒,而volatile保證了這個變量一旦被修改,就立刻寫回主存匪补,此時其他線程再訪問時伞辛,保證了數(shù)據(jù)的同步。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末夯缺,一起剝皮案震驚了整個濱河市蚤氏,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌踊兜,老刑警劉巖竿滨,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異捏境,居然都是意外死亡于游,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進店門垫言,熙熙樓的掌柜王于貴愁眉苦臉地迎上來贰剥,“玉大人,你說我怎么就攤上這事筷频“龀桑” “怎么了?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵凛捏,是天一觀的道長担忧。 經(jīng)常有香客問我,道長葵袭,這世上最難降的妖魔是什么涵妥? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮坡锡,結(jié)果婚禮上蓬网,老公的妹妹穿的比我還像新娘。我一直安慰自己鹉勒,他們只是感情好帆锋,可當我...
    茶點故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著禽额,像睡著了一般锯厢。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上脯倒,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天实辑,我揣著相機與錄音,去河邊找鬼藻丢。 笑死剪撬,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的悠反。 我是一名探鬼主播残黑,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼斋否!你這毒婦竟也來了梨水?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤茵臭,失蹤者是張志新(化名)和其女友劉穎疫诽,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體旦委,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡踊沸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了社证。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片逼龟。...
    茶點故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖追葡,靈堂內(nèi)的尸體忽然破棺而出腺律,到底是詐尸還是另有隱情,我是刑警寧澤宜肉,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布匀钧,位于F島的核電站,受9級特大地震影響谬返,放射性物質(zhì)發(fā)生泄漏之斯。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一遣铝、第九天 我趴在偏房一處隱蔽的房頂上張望佑刷。 院中可真熱鬧莉擒,春花似錦、人聲如沸瘫絮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽麦萤。三九已至鹿鳖,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間壮莹,已是汗流浹背翅帜。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留命满,地道東北人涝滴。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像周荐,于是被迫代替她去往敵國和親狭莱。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,960評論 2 355

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