synchronized和volatile

synchronized

? ? ? 在JDK 5之前Java語(yǔ)言是靠synchronized關(guān)鍵字保證同步的,這會(huì)導(dǎo)致有鎖(后面的章節(jié)還會(huì)談到鎖)纺座。

鎖機(jī)制存在以下問(wèn)題:

(1)在多線程競(jìng)爭(zhēng)下息拜,加鎖、釋放鎖會(huì)導(dǎo)致比較多的上下文切換和調(diào)度延時(shí)净响,引起性能問(wèn)題少欺。

(2)一個(gè)線程持有鎖會(huì)導(dǎo)致其它所有需要此鎖的線程掛起。

(3)如果一個(gè)優(yōu)先級(jí)高的線程等待一個(gè)優(yōu)先級(jí)低的線程釋放鎖會(huì)導(dǎo)致優(yōu)先級(jí)倒置馋贤,引起性能風(fēng)險(xiǎn)赞别。

 volatile是不錯(cuò)的機(jī)制,但是volatile不能保證原子性配乓。因此對(duì)于線程同步最終還是要回到鎖機(jī)制上來(lái)仿滔。

  synchronized實(shí)現(xiàn)同步的基礎(chǔ):Java中的每一個(gè)對(duì)象都可以作為鎖惠毁。具體表現(xiàn)為以下3種形式。?

    ?對(duì)于普通同步方法崎页,鎖是當(dāng)前實(shí)例對(duì)象鞠绰。?

    ?對(duì)于靜態(tài)同步方法,鎖是當(dāng)前類的Class對(duì)象飒焦。??

    ?對(duì)于同步方法塊蜈膨,鎖是Synchonized括號(hào)里配置的對(duì)象。

? ? ? 獨(dú)占鎖是一種悲觀鎖荒给,synchronized就是一種獨(dú)占鎖丈挟,會(huì)導(dǎo)致其它所有需要鎖的線程掛起,等待持有鎖的線程釋放鎖 .從javaSE 1.6之后志电,為了減少獲得鎖和釋放鎖帶來(lái)的性能消耗曙咽,引入了“偏向鎖”和“輕量級(jí)鎖”.自此,鎖一共有4種狀態(tài)挑辆,級(jí)別從低到高依次是:無(wú)鎖狀態(tài)例朱、偏向鎖狀態(tài)、輕量級(jí)鎖狀態(tài)和重量級(jí)鎖狀態(tài)鱼蝉,這幾個(gè)狀態(tài)會(huì)隨著競(jìng)爭(zhēng)情況逐漸升級(jí)洒嗤。鎖可以升級(jí)但不能降級(jí),意味著偏向鎖升級(jí)成輕量級(jí)鎖后不能降級(jí)成偏向鎖魁亦。這種鎖升級(jí)卻不能降級(jí)的策略渔隶,目的是為了提高獲得鎖和釋放鎖的效率. 這幾種鎖各自特性如下:

提到了自旋的概念,也順帶提下:

自旋鎖的概念

首先是一種鎖洁奈,與互斥鎖相似间唉,基本作用是用于線程(進(jìn)程)之間的同步。與普通鎖不同的是利术,一個(gè)線程A在獲得普通鎖后呈野,如果再有線程B試圖獲取鎖,那么這個(gè)線程B將會(huì)掛起(阻塞)印叁;試想下被冒,如果兩個(gè)線程資源競(jìng)爭(zhēng)不是特別激烈,而處理器阻塞一個(gè)線程引起的線程上下文的切換的代價(jià)高于等待資源的代價(jià)的時(shí)候(鎖的已保持者保持鎖時(shí)間比較短)轮蜕,那么線程B可以不放棄CPU時(shí)間片昨悼,而是在“原地”忙等,直到鎖的持有者釋放了該鎖肠虽,這就是自旋鎖的原理幔戏,可見(jiàn)自旋鎖是一種非阻塞鎖。

二税课、自旋鎖可能引起的問(wèn)題:

1.占據(jù)CPU時(shí)間過(guò)長(zhǎng):如果鎖的當(dāng)前持有者長(zhǎng)時(shí)間不釋放該鎖闲延,那么等待者將長(zhǎng)時(shí)間的占據(jù)cpu時(shí)間片痊剖,導(dǎo)致CPU資源的浪費(fèi),因此可以設(shè)定一個(gè)時(shí)間垒玲,當(dāng)鎖持有者超過(guò)這個(gè)時(shí)間不釋放鎖時(shí)陆馁,等待者會(huì)放棄CPU時(shí)間片阻塞;

2.容易引發(fā)死鎖問(wèn)題:試想一下合愈,有一個(gè)線程連續(xù)兩次試圖獲得自旋鎖(比如在遞歸程序中)叮贩,第一次這個(gè)線程獲得了該鎖,當(dāng)?shù)诙卧噲D加鎖的時(shí)候佛析,檢測(cè)到鎖已被占用(其實(shí)是被自己占用)益老,那么這時(shí),線程會(huì)一直等待自己釋放該鎖寸莫,而不能繼續(xù)執(zhí)行捺萌,這樣就引起了死鎖。因此遞歸程序使用自旋鎖應(yīng)該遵循以下原則:遞歸程序決不能在持有自旋鎖時(shí)調(diào)用它自己膘茎,也決不能在遞歸調(diào)用時(shí)試圖獲得相同的自旋鎖桃纯。


volatile的定義:

  Java語(yǔ)言規(guī)范第3版中對(duì)volatile的定義如下:Java編程語(yǔ)言允許線程訪問(wèn)共享變量,為了確保共享變量能被準(zhǔn)確和一致地更新披坏,線程應(yīng)該確保通過(guò)排他鎖單獨(dú)獲得這個(gè)變量态坦。Java語(yǔ)言提供了volatile,在某些情況下比鎖要更加方便棒拂。如果一個(gè)字段被聲明成volatile伞梯,Java線程內(nèi)存模型確保所有線程看到這個(gè)變量的值是一致的。

1.volatile是輕量級(jí)的synchronized帚屉,它在多處理器開(kāi)發(fā)中保證了共享變量的“可見(jiàn)性”壮锻。可見(jiàn)性的意思是當(dāng)一個(gè)線程修改一個(gè)共享變量時(shí)涮阔,另外一個(gè)線程能讀到這個(gè)修改的值.

2.volatile比synchronized的使用和執(zhí)行成本更低,因?yàn)樗粫?huì)引起線程上下文的切換和調(diào)度灰殴。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末敬特,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子牺陶,更是在濱河造成了極大的恐慌伟阔,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,039評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件掰伸,死亡現(xiàn)場(chǎng)離奇詭異皱炉,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)狮鸭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)合搅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)多搀,“玉大人,你說(shuō)我怎么就攤上這事灾部】得” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,417評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵赌髓,是天一觀的道長(zhǎng)从藤。 經(jīng)常有香客問(wèn)我,道長(zhǎng)锁蠕,這世上最難降的妖魔是什么夷野? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,868評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮荣倾,結(jié)果婚禮上悯搔,老公的妹妹穿的比我還像新娘。我一直安慰自己逃呼,他們只是感情好鳖孤,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著抡笼,像睡著了一般苏揣。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上推姻,一...
    開(kāi)封第一講書(shū)人閱讀 51,692評(píng)論 1 305
  • 那天平匈,我揣著相機(jī)與錄音,去河邊找鬼藏古。 笑死增炭,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的拧晕。 我是一名探鬼主播隙姿,決...
    沈念sama閱讀 40,416評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼厂捞!你這毒婦竟也來(lái)了输玷?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,326評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤靡馁,失蹤者是張志新(化名)和其女友劉穎欲鹏,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體臭墨,經(jīng)...
    沈念sama閱讀 45,782評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡赔嚎,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片尤误。...
    茶點(diǎn)故事閱讀 40,102評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡侠畔,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出袄膏,到底是詐尸還是另有隱情践图,我是刑警寧澤,帶...
    沈念sama閱讀 35,790評(píng)論 5 346
  • 正文 年R本政府宣布沉馆,位于F島的核電站码党,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏斥黑。R本人自食惡果不足惜揖盘,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評(píng)論 3 331
  • 文/蒙蒙 一秽荞、第九天 我趴在偏房一處隱蔽的房頂上張望宴合。 院中可真熱鬧贱案,春花似錦负芋、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,996評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)献联。三九已至茴恰,卻和暖如春颠焦,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背往枣。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,113評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工伐庭, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人分冈。 一個(gè)月前我還...
    沈念sama閱讀 48,332評(píng)論 3 373
  • 正文 我出身青樓圾另,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親雕沉。 傳聞我的和親對(duì)象是個(gè)殘疾皇子集乔,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評(píng)論 2 355

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

  • Java8張圖 11、字符串不變性 12坡椒、equals()方法饺著、hashCode()方法的區(qū)別 13、...
    Miley_MOJIE閱讀 3,707評(píng)論 0 11
  • 從三月份找實(shí)習(xí)到現(xiàn)在肠牲,面了一些公司,掛了不少靴跛,但最終還是拿到小米缀雳、百度、阿里梢睛、京東肥印、新浪识椰、CVTE、樂(lè)視家的研發(fā)崗...
    時(shí)芥藍(lán)閱讀 42,253評(píng)論 11 349
  • 每個(gè)線程都有自己的執(zhí)行空間(即工作內(nèi)存)深碱,線程執(zhí)行的時(shí)候用到某變量腹鹉,首先要將變量從主內(nèi)存拷貝的自己的工作內(nèi)存空間,...
    扈扈哈嘿閱讀 396評(píng)論 2 5
  • 火車轟隆隆的走著敷硅,我不自主的隨著車廂搖搖晃晃功咒。我看見(jiàn)“我”坐在火車上一個(gè)奇怪的位置,那是最后一節(jié)車廂的最后一個(gè)座位...
    我們都曾言不由衷閱讀 375評(píng)論 0 1
  • 前幾天看了一篇介紹一個(gè)專賣干花的花店的文章绞蹦,說(shuō)是不用任何的技術(shù)力奋,只要把鮮花倒吊在通風(fēng)背光的地方,等清風(fēng)徐來(lái)幽七,等時(shí)光...
    方葉子閱讀 590評(píng)論 8 13