Synchronized和Lock的區(qū)別

Synchronized和Lock的區(qū)別

并發(fā)編程中篮条,鎖是經(jīng)常需要使用的切端。在開發(fā)中我們常用的鎖有兩種Synchronized和Lock磅轻。

線程安全問題

線程安全是在多線程編程中拐格,有可能會出現(xiàn)同時訪問同一個 共享掉分、可變資源 的情況俭缓,始終都不會導(dǎo)致數(shù)據(jù)破壞以及其他不該出現(xiàn)的結(jié)果。這種資源可以是一個變量酥郭、一個對象华坦、一個文件等。

共享:多個線程可以同時訪問該共享變量不从。
可變:數(shù)據(jù)在生命周期中可以被改變惜姐。

鎖的概念

JAVA 內(nèi)置鎖

隱性鎖:每個JAVA對象可以用作實現(xiàn)同步的內(nèi)置鎖,線程在訪問同步代碼塊時必須先獲取該內(nèi)置鎖椿息,在退出和中斷的時候需要釋放內(nèi)置鎖歹袁。Java內(nèi)置鎖通過synchronized關(guān)鍵字使用,使用其修飾方法或者代碼塊寝优,就能保證方法或者代碼塊以同步方式執(zhí)行条舔。有對象鎖和類鎖(static方法和class上枷鎖)區(qū)分,兩者不沖突可以并行存在乏矾。

顯性鎖:顯式鎖(ReentrantLock)正式為了解決這些靈活需求而生孟抗,ReentrantLock的字面意思是可重入鎖,可重入的意思是線程可以同時多次請求同一把鎖钻心,而不會自己導(dǎo)致自己死鎖凄硼。

鎖的分類

可重入鎖:Synchronized和ReentrantLook都是可重入鎖,鎖的可重入性標(biāo)明了鎖是針對線程分配方式而不是針對方法捷沸。例如調(diào)用Synchronized方法A中可以調(diào)用Synchronized方法B帆喇,而不需要重新申請鎖。

讀寫鎖:按照數(shù)據(jù)庫事務(wù)隔離特性的類比讀寫鎖亿胸,在訪問統(tǒng)一個資源(一個文件)的時候坯钦,使用讀鎖來保證多線程可以同步讀取資源预皇。ReadWriteLock是一個讀寫鎖,通過readLock()獲取讀鎖婉刀,通過writeLock()獲取寫鎖吟温。

可中斷鎖:可中斷是指鎖是可以被中斷的,Synchronized內(nèi)置鎖是不可中斷鎖突颊,ReentrantLock可以通過lockInterruptibly方法中斷顯性鎖鲁豪。例如線程B在等待等待線程A釋放鎖,但是線程B由于等待時間太久律秃,可以主動中斷等待鎖爬橡。

公平鎖:公平鎖是指盡量以線程的等待時間先后順序獲取鎖,等待時間最久的線程優(yōu)先獲取鎖棒动。synchronized隱性鎖是非公平鎖糙申,它無法保證等待的線程獲取鎖的順序,ReentrantLook可以自己控制是否公平鎖船惨。

兩種鎖的底層實現(xiàn)

Synchronized:底層使用指令碼方式來控制鎖的柜裸,映射成字節(jié)碼指令就是增加來兩個指令:monitorenter和monitorexit。當(dāng)線程執(zhí)行遇到monitorenter指令時會嘗試獲取內(nèi)置鎖粱锐,如果獲取鎖則鎖計數(shù)器+1疙挺,如果沒有獲取鎖則阻塞;當(dāng)遇到monitorexit指令時鎖計數(shù)器-1怜浅,如果計數(shù)器為0則釋放鎖铐然。

Lock:底層是CAS樂觀鎖,依賴AbstractQueuedSynchronizer類恶座,把所有的請求線程構(gòu)成一個CLH隊列搀暑。而對該隊列的操作均通過Lock-Free(CAS)操作。

Synchronized和Lock比較

  • Synchronized是關(guān)鍵字奥裸,內(nèi)置語言實現(xiàn),Lock是接口沪袭。
  • Synchronized在線程發(fā)生異常時會自動釋放鎖湾宙,因此不會發(fā)生異常死鎖。Lock異常時不會自動釋放鎖冈绊,所以需要在finally中實現(xiàn)釋放鎖侠鳄。
  • Lock是可以中斷鎖,Synchronized是非中斷鎖死宣,必須等待線程執(zhí)行完成釋放鎖伟恶。
  • Lock可以使用讀鎖提高多線程讀效率。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末毅该,一起剝皮案震驚了整個濱河市博秫,隨后出現(xiàn)的幾起案子潦牛,更是在濱河造成了極大的恐慌,老刑警劉巖挡育,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件巴碗,死亡現(xiàn)場離奇詭異,居然都是意外死亡即寒,警方通過查閱死者的電腦和手機(jī)橡淆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來母赵,“玉大人逸爵,你說我怎么就攤上這事“汲埃” “怎么了师倔?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長施绎。 經(jīng)常有香客問我溯革,道長,這世上最難降的妖魔是什么谷醉? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任致稀,我火速辦了婚禮,結(jié)果婚禮上俱尼,老公的妹妹穿的比我還像新娘抖单。我一直安慰自己,他們只是感情好遇八,可當(dāng)我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布矛绘。 她就那樣靜靜地躺著,像睡著了一般刃永。 火紅的嫁衣襯著肌膚如雪货矮。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天斯够,我揣著相機(jī)與錄音囚玫,去河邊找鬼。 笑死读规,一個胖子當(dāng)著我的面吹牛抓督,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播束亏,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼铃在,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起定铜,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤阳液,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后宿稀,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體趁舀,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年祝沸,在試婚紗的時候發(fā)現(xiàn)自己被綠了矮烹。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡罩锐,死狀恐怖奉狈,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情涩惑,我是刑警寧澤仁期,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站竭恬,受9級特大地震影響跛蛋,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜痊硕,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一赊级、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧岔绸,春花似錦理逊、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至刚盈,卻和暖如春羡洛,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背藕漱。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工欲侮, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人谴分。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓锈麸,卻偏偏與公主長得像镀脂,于是被迫代替她去往敵國和親牺蹄。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,465評論 2 348