Synchronized&Lock&AQS

??1.java鎖

??2.Synchronized鎖的使用與原理

加鎖方式:(1)、同步方法鎖,進入方法前獲取當(dāng)前類的實例鎖

????????????????? (2)、 同步靜態(tài)方法鎖宵距,進入方法前獲取當(dāng)前類對象鎖

????????????????? (3)、同步代碼塊吨拗,給指定對象加鎖满哪,進入代碼塊前獲取指定對象鎖

???? ?? 2.1底層原理:JVM內(nèi)置鎖通過Synchronized使用,通過內(nèi)部對象Monuitor(監(jiān)視器鎖)實現(xiàn)劝篷,基于進入與退出Monitor對象實現(xiàn)方法與代碼快同步哨鸭,監(jiān)視器鎖的實現(xiàn)依賴底層操作系統(tǒng)Mutex lock--(互斥鎖:互斥鎖是互斥標志。它充當(dāng)一段代碼的網(wǎng)守携龟,允許一個線程進入并阻止對所有其他線程的訪問兔跌。這樣可以確保被控制的代碼一次只能被單個線程訪問。只要確保完成后釋放互斥量即可) --實現(xiàn)峡蟋,它是一個重量級鎖性能較低坟桅。

???????2.2Monuitor詳解

??????? 如果T1 T2 Tn都到了Monuitor臨界點他們共同競爭Monuitor對應(yīng)的管成對象,此時T1拿到了管成對象蕊蝗,則其他線程會被放到waitset這個集合隊列中仅乓,拿到監(jiān)視器鎖的線程此時此刻就會進入方法或者同步代碼塊執(zhí)行業(yè)務(wù)代碼,T1走完之后T1會釋放Monuitor對象蓬戚,之后會去喚醒正在等待的線程夸楣,這些線程再去搶奪鎖。

??3.對象內(nèi)存結(jié)構(gòu)

?? 對象頭:比如hash碼子漩,對象所屬的年代豫喧,對象鎖,鎖狀態(tài)標志幢泼,偏向鎖(線程) ID 紧显,偏向時間,數(shù)組長度(數(shù)組對象) 等缕棵,?

?? 對象實際數(shù)據(jù):即創(chuàng)建對象時孵班,對象中成員方法變量,方法時招驴。

?? 對齊填充:對象的大小必須時8字節(jié)的整數(shù)倍

???? 3.1實例對象在內(nèi)存中存儲在哪里呢篙程?

???? 答: (1)實例對象存儲再堆區(qū)時:實例對象內(nèi)存存在堆區(qū),實例引用存在棧上别厘,實例的元數(shù)據(jù)class存在方法區(qū)或者元空間(方法區(qū)中存放的是類型信息虱饿、常量、靜態(tài)變量触趴、即時編譯器編譯后的代碼緩存氮发、域信息、方法信息等雕蔽。隨著JDK的發(fā)展折柠,方法區(qū)中存放的內(nèi)容也在發(fā)生變化。并不絕對批狐。通常情況下放的是這些內(nèi)容)扇售。

???????????? (2)如果對象沒有發(fā)生對象逃逸(如果一個對象被發(fā)現(xiàn)只能從一個線程訪問到,那么對于這個對象的操作可以不考慮同步)的話嚣艇,那么所有對象都將被存儲在堆中承冰,如果發(fā)生逃逸對象則有可能逃逸到棧內(nèi)存。

?? ?? 3.2鎖的粗化:一個append方法就要加一個鎖來保證線程安全食零,因為要做四次添加操作困乒,jvm會優(yōu)化加一個總的鎖。

???? 3.3鎖的消除:以下同步塊加的鎖毫無意義贰谣,不同線程訪問到不同的對象鎖是沒有意義的娜搂,jvm會進行逃逸分析不會加鎖迁霎。

???3.4輕量級鎖的應(yīng)用場景:

?????? 線程見交替執(zhí)行場景,輕量級鎖是在并發(fā)量少百宇,產(chǎn)生線程競爭較少的場景考廉,如果出現(xiàn)了搶奪鎖的情況,如下圖T1線程在執(zhí)行任務(wù)携御,T2在想要獲取同一把鎖昌粤,此時會自旋等待機會再次獲取鎖,他不會將線程阻塞啄刹。在jdk1.7自旋的次數(shù)會根據(jù)上一次的自旋次數(shù)進行自適應(yīng)自旋的次數(shù)涮坐。

???4.鎖的升級過程:

? ? ? ??4.1? 無鎖狀態(tài)升級到輕量級鎖過程

???????? (1).線程1訪問同步塊,檢查標志為01和是否偏向0誓军,后獲取偏向鎖袱讹,修改Mark Word中線程id指向自己,從無鎖狀態(tài)改為偏向鎖狀態(tài)谭企,開始執(zhí)行代碼邏輯廓译,在執(zhí)行過程中,線程2也來到臨界點準備訪問同步塊债查,檢查是否偏向線程id是否是自己非区,CAS準備偏向線程ID是否是自己,此時線程1正占用鎖盹廷,所以修改失敗征绸,再線程1的執(zhí)行到達安全點時要求線程1撤銷偏向鎖,升級為輕量級鎖俄占,如果剛好再要求撤銷時線程1執(zhí)行完畢了已經(jīng)退出同步代碼塊管怠,解鎖后將ThreadID置空同時將偏向由1改為0,線程2重新獲取偏向鎖執(zhí)行缸榄。


? ? ? ??4.2? 無鎖狀態(tài)升級到重量級鎖過程

????? (1)渤弛,在線程訪問同步代碼塊的時候當(dāng)前線程會在棧上開辟一塊空間LockRecord,同時復(fù)制MakerWork過來甚带,并且同時會定義一個叫做owner的指針變量她肯,鎖從偏向鎖升級到輕量級鎖的時候會把MakerWork前面30位定義為指針,指向棧內(nèi)存中開辟的LockRecord空間鹰贵,owner指針也會指向堆內(nèi)存中的MakerWork空間晴氨,

??????? (2),線程1和線程2同時訪問同步代碼塊同時會開辟一塊LockRecord空間同時復(fù)制MarkWord過來碉输,然后線程1和線程2同時開始CAS修改籽前,拿到執(zhí)行權(quán)的線程1修改Mark Word中的指針指向地址,升級為輕量級鎖,此時線程1開始執(zhí)行同步體枝哄,線程2來進行第一次修改肄梨,修改失敗進入自旋,如果線程1執(zhí)行完邏輯代碼之后膘格,可能會自旋成功峭范,如果自旋次數(shù)過多失敗的話财松,先會向系統(tǒng)底層Pthread線程調(diào)度庫瘪贱,申請一個互斥量此時又會發(fā)生用戶態(tài)到內(nèi)核態(tài)的轉(zhuǎn)變(這個過程非常耗費資源) ,申請完互斥量后會將Mark Word中的前30位指向不再指向線程1開辟的LockRecord空間辆毡,轉(zhuǎn)而指向我們的重量級鎖依靠底層的互斥量菜秦,之后調(diào)用Pthread庫中的Pthread_mutex_loc將線程阻塞掛起,此時線程1執(zhí)行完之后想要釋放輕量級鎖發(fā)現(xiàn)MarkWord中前30位被修改了舶掖,他會釋放輕量級鎖并且會喚醒阻塞的線程球昨,進行新一輪的鎖競爭。??

??5.同步框1架AQS

??? ??5.1 AQS簡介:等待隊列眨攘,條件隊列主慰,獨占獲取,共享獲取等鲫售。

???????? ??5.2 可重入鎖和非可重入鎖區(qū)別

???????????? 一個線程可能帶著多個子流程共螺,在這些子流程執(zhí)行完之后才可以釋放鎖,這些子流程都可以獲取同一把鎖情竹,這是可重入鎖藐不,線程的子流程不可以獲取同一把鎖這是不可重入鎖,下面是一個經(jīng)典例子:

??????????? ??5.3 并發(fā)包內(nèi)部基本實現(xiàn)

?????????? ??5.4 條件隊列和等待隊列

????????????????? (1)每個節(jié)點都有自己秦效,結(jié)點狀態(tài)waitStatus

??????? 這里我們說下Node雏蛮。Node結(jié)點是對每一個等待獲取資源的線程的封裝,其包含了需要同步的線程本身及其等待狀態(tài)阱州,如是否被阻塞挑秉、是否等待喚醒、是否已經(jīng)被取消等苔货。變量waitStatus則表示當(dāng)前Node結(jié)點的等待狀態(tài)犀概,共有5種取值CANCELLED、SIGNAL蒲赂、CONDITION阱冶、PROPAGATE、0滥嘴。

??????? CANCELLED(1):表示當(dāng)前結(jié)點已取消調(diào)度木蹬。當(dāng)timeout或被中斷(響應(yīng)中斷的情況下),會觸發(fā)變更為此狀態(tài),進入該狀態(tài)后的結(jié)點將不會再變化镊叁。

???????? SIGNAL(-1):表示后繼結(jié)點在等待當(dāng)前結(jié)點喚醒尘颓。后繼結(jié)點入隊時,會將前繼結(jié)點的狀態(tài)更新為SIGNAL晦譬。????? ?? ???? CONDITION(-2):表示結(jié)點等待在Condition上疤苹,當(dāng)其他線程調(diào)用了Condition的signal()方法后,CONDITION狀態(tài)的結(jié)點將從等待隊列轉(zhuǎn)移到同步隊列中敛腌,等待獲取同步鎖卧土。

??????? PROPAGATE(-3):共享模式下,前繼結(jié)點不僅會喚醒其后繼結(jié)點像樊,同時也可能會喚醒后繼的后繼結(jié)點尤莺。

???????? 0:新結(jié)點入隊時的默認狀態(tài)。注意生棍,負值表示結(jié)點處于有效等待狀態(tài)颤霎,而正值表示結(jié)點已被取消。所以源碼中很多地方用>0涂滴、<0來判斷結(jié)點的狀態(tài)是否正常友酱。
???????????? 等待隊列相當(dāng)于,數(shù)據(jù)結(jié)構(gòu)中的雙向鏈表柔纵,通常用于自旋鎖缔杉。使用雙向隊列來實現(xiàn)阻塞的同步所有的任務(wù)。

????????????????????????? 條件隊列相當(dāng)于單向鏈表首量,prev前驅(qū)指針和next后驅(qū)指針都為空

????????????? ??5.5 非公平鎖和公平鎖

? ? ? ? ? ? ?? 非公平就是不用進去隊列壮吩,直接跟隊列中的緊接著要訪問同步鎖的線程進行競爭,競爭成功則拿到鎖執(zhí)行邏輯代碼加缘,競爭失敗則到隊列中排隊鸭叙。

?????????????

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市拣宏,隨后出現(xiàn)的幾起案子沈贝,更是在濱河造成了極大的恐慌,老刑警劉巖勋乾,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件宋下,死亡現(xiàn)場離奇詭異,居然都是意外死亡辑莫,警方通過查閱死者的電腦和手機学歧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來各吨,“玉大人枝笨,你說我怎么就攤上這事。” “怎么了横浑?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵剔桨,是天一觀的道長。 經(jīng)常有香客問我徙融,道長洒缀,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任欺冀,我火速辦了婚禮树绩,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘脚猾。我一直安慰自己葱峡,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布龙助。 她就那樣靜靜地躺著,像睡著了一般蛛芥。 火紅的嫁衣襯著肌膚如雪提鸟。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天仅淑,我揣著相機與錄音称勋,去河邊找鬼。 笑死涯竟,一個胖子當(dāng)著我的面吹牛赡鲜,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播庐船,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼银酬,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了筐钟?” 一聲冷哼從身側(cè)響起揩瞪,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎篓冲,沒想到半個月后李破,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡壹将,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年嗤攻,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片诽俯。...
    茶點故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡妇菱,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情恶耽,我是刑警寧澤密任,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布,位于F島的核電站偷俭,受9級特大地震影響浪讳,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜涌萤,卻給世界環(huán)境...
    茶點故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一淹遵、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧负溪,春花似錦透揣、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至崖堤,卻和暖如春侍咱,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背密幔。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工楔脯, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人胯甩。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓昧廷,卻偏偏與公主長得像,于是被迫代替她去往敵國和親偎箫。 傳聞我的和親對象是個殘疾皇子木柬,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,435評論 2 359

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