Java synchronized和lock鎖

synchronized和lock鎖區(qū)別

  • synchronized是關鍵字,lock是juc包下的一個接口芝囤。
  • synchronized和lock都是可重入的质和。
  • synchronized是公平鎖队魏,lock支持公平和非公平兩種限寞。
  • synchronized是不可中斷的,lock是可中斷的砰琢。
  • lock可以通過 tryLock方法設置超時時間蘸嘶,lock加鎖之后一定要手動釋放鎖,且lock可以判斷鎖的狀態(tài)氯析。

synchronized實現(xiàn)原理

synchronized鎖是基于對象實現(xiàn)的亏较,對象存儲在堆中,每個對象會有一個對象頭掩缓,對象頭里面會有一個markword來記錄當前鎖的一個狀態(tài):無鎖(匿名偏向)雪情、偏向鎖、輕量級鎖你辣、重量級鎖巡通。

鎖升級過程:當線程訪問synchronized同步代碼塊時尘执,會先嘗試加偏向鎖,如果加成功直接返回宴凉;失敗就說明當前已經有別的線程獲取了鎖誊锭,就會嘗試升級成輕量級鎖,線程會使用cas自旋一定次數來獲取鎖弥锄,如果還是獲取鎖失敗就會升級成重量級鎖丧靡,此時線程就會進入block狀態(tài)。

在jdk1.6之前籽暇,synchronized只有重量級鎖温治。在jdk1.6之后增加了鎖升級的機制,另外還增加了鎖消除和鎖膨脹的優(yōu)化:

  • 鎖消除:synchronized同步代碼塊中沒有臨界資源的訪問戒悠,不在加鎖熬荆。
  • 鎖膨脹:for循環(huán)中使用synchronized加鎖,就會導致頻繁的加鎖和釋放鎖绸狐,為了避免不必要的鎖資源消耗卤恳,就會擴大鎖的范圍。

lock實現(xiàn)原理

lock底層是基于AQS實現(xiàn)寒矿。AQS是抽象隊列同步器突琳,是一個用來構建鎖和同步器的框架。

AQS關鍵數據結構

  • state:同步變量符相,使用volatile關鍵字修飾本今,表示鎖的狀態(tài),state=0代表當前沒有加鎖主巍,大于0表示有線程加鎖。
  • 等待隊列:加鎖失敗的線程會進入到等待隊列中挪凑。等待隊列是個雙向鏈表孕索,每個node節(jié)點有前繼和后繼節(jié)點,等待鎖的線程躏碳,以及等待狀態(tài)搞旭。

加鎖過程

  • 非公平鎖:線程會先直接使用cas的方式去修改state變量(從0修改成1),如果修改成功菇绵,則表示該線程獲得了鎖肄渗。否則表示加鎖失敗,線程加入到等待隊列中咬最,線程會被掛起/阻塞翎嫡。
  • 公平鎖:線程會先判斷等待隊列中是否為空,等待隊列不為空直接進等待隊列排隊永乌;等待隊列為空才會使用cas嘗試去修改state變量獲得鎖惑申,cas失敗進等待隊列排隊具伍。

釋放鎖過程

線程使用cas的方式將state減1,如果state等于0圈驼,表示鎖釋放人芽。喚醒隊列第一個線程,喚醒之后隊列第一個線程通過cas的方式嘗試加鎖绩脆,一旦加鎖成功萤厅,就會把自己移除隊列,讓下一個節(jié)點變成對頭靴迫,然后該線程就可以去執(zhí)行邏輯了惕味。

AQS喚醒節(jié)點時,為何從后往前找第一個節(jié)點

因為等待隊列添加節(jié)點(以及節(jié)點取消)時矢劲,是先調整新節(jié)點的前向指針赦拘,再調整tail指針(此時原來tail指針的next指針還是null),最后在調整原來tail的next指針芬沉,如果從前往后找躺同,會存在節(jié)點丟失(沒訪問到)的情況。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末丸逸,一起剝皮案震驚了整個濱河市蹋艺,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌黄刚,老刑警劉巖捎谨,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異憔维,居然都是意外死亡涛救,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進店門业扒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來检吆,“玉大人,你說我怎么就攤上這事程储〔渑妫” “怎么了?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵章鲤,是天一觀的道長摊灭。 經常有香客問我,道長败徊,這世上最難降的妖魔是什么帚呼? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮集嵌,結果婚禮上萝挤,老公的妹妹穿的比我還像新娘御毅。我一直安慰自己,他們只是感情好怜珍,可當我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布端蛆。 她就那樣靜靜地躺著,像睡著了一般酥泛。 火紅的嫁衣襯著肌膚如雪今豆。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天柔袁,我揣著相機與錄音呆躲,去河邊找鬼。 笑死捶索,一個胖子當著我的面吹牛插掂,可吹牛的內容都是我干的。 我是一名探鬼主播腥例,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼辅甥,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了燎竖?” 一聲冷哼從身側響起璃弄,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎构回,沒想到半個月后夏块,有當地人在樹林里發(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡纤掸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年脐供,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片借跪。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡患民,死狀恐怖,靈堂內的尸體忽然破棺而出垦梆,到底是詐尸還是另有隱情,我是刑警寧澤仅孩,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布托猩,位于F島的核電站,受9級特大地震影響辽慕,放射性物質發(fā)生泄漏京腥。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一溅蛉、第九天 我趴在偏房一處隱蔽的房頂上張望公浪。 院中可真熱鬧他宛,春花似錦、人聲如沸欠气。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽预柒。三九已至队塘,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間宜鸯,已是汗流浹背憔古。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留淋袖,地道東北人鸿市。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像即碗,于是被迫代替她去往敵國和親焰情。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內容