Java多線程鎖機(jī)制相關(guān)原理實(shí)例解析
上下文:程序運(yùn)行需要的環(huán)境(外部變量)
上下文切換:將之前的程序需要的外部變量復(fù)制保存,然后切換到新的程序運(yùn)行環(huán)境
系統(tǒng)調(diào)用:(用戶態(tài)陷入操作系統(tǒng),通過(guò)操作系統(tǒng)執(zhí)行內(nèi)核態(tài)指令,執(zhí)行完回到用戶態(tài))用戶態(tài)——內(nèi)核態(tài)——用戶態(tài):兩次上下文切換
線程wait()方法:將自身加入等待隊(duì)列,發(fā)生了一次上下文切換
notify()方法:將線程喚醒,也發(fā)生了上下文切換
Java線程中的鎖:偏向鎖、輕量級(jí)鎖、重量級(jí)鎖。
注意:偏向鎖和輕量級(jí)鎖都沒(méi)有發(fā)生競(jìng)爭(zhēng),重量級(jí)鎖發(fā)生了競(jìng)爭(zhēng)。
偏向鎖:可重入和經(jīng)常使用某一個(gè)線程。
輕量級(jí)鎖:線程之間的切換,但是未發(fā)生競(jìng)爭(zhēng)(在一個(gè)時(shí)間段只有一個(gè)線程使用)
重量級(jí)鎖:線程時(shí)間的競(jìng)爭(zhēng)。
臨界區(qū):多個(gè)線程共享臨界區(qū),而且存在對(duì)臨界區(qū)的讀寫(xiě)。
無(wú)所狀態(tài):hashcode 31位 年齡age:4位 是否是偏向鎖:block_lock:一位:0表示不是偏向鎖
偏向鎖:thread:54位 線程id epoch 2位,作為批量重偏向的記錄 biased_lock:1 表示為偏向鎖
輕量級(jí)鎖:ptr_to_lock_record:62位 表示,鎖記錄的指針
重量級(jí)鎖:ptr_to_heavyweight_monitor :62位 表示monitor指針
輕量級(jí)鎖的流程:
鎖記錄有兩個(gè)指針:一個(gè)指向自身,一個(gè)指向lock對(duì)象,當(dāng)lock對(duì)象位state位01時(shí),表示位輕量級(jí)鎖,此時(shí)執(zhí)行輕量級(jí)鎖的加鎖:交換lock record和markword
鎖重入:
同樣創(chuàng)建一個(gè)LockRecord 但此時(shí)cas失敗,因?yàn)榇藭r(shí)lock對(duì)象的markword為當(dāng)前鎖記錄的指針,置lockrecord指針為null,表示鎖重入,并且添加一個(gè)鎖重入計(jì)數(shù)器,記錄鎖重入的次數(shù)
解鎖:將LockRecord中的lockrecord(此時(shí)是markword)和lock對(duì)象(Object)中的markword(lockrecord指針)。如果解鎖失敗,那么輕量級(jí)鎖就會(huì)膨脹為重量級(jí)鎖。
重量級(jí)鎖的加鎖、解鎖、阻塞、喚醒:只有重量級(jí)鎖有阻塞
如上圖:當(dāng)發(fā)生競(jìng)爭(zhēng)時(shí),新的線程會(huì)將object修改為monitor指針,指向重量級(jí)鎖的monitor(管程),然后進(jìn)入等待隊(duì)列,當(dāng)當(dāng)前線程結(jié)束同步代碼塊,就會(huì)將owner置為0,此時(shí)表示沒(méi)有線程擁有此鎖,然后喚醒其他線程,其他線程就會(huì)競(jìng)爭(zhēng)這個(gè)鎖。
偏向鎖的加鎖和解鎖:新的線程只需要判斷l(xiāng)ock對(duì)象的markword對(duì)象中的線程id是否是自己的id,如果是,那么就直接使用這個(gè)鎖。不用作cas交換,只有第一次獲得此鎖時(shí)需要用cas交換
調(diào)用hashcode可以撤銷(xiāo)偏向鎖,或者對(duì)同一個(gè)對(duì)象發(fā)生鎖同步時(shí)也會(huì)撤銷(xiāo)偏向鎖
偏向鎖重定向:對(duì)于一個(gè)類(lèi)的多個(gè)實(shí)現(xiàn)類(lèi)鎖對(duì)象,當(dāng)超過(guò)20次重定向時(shí),后面該鎖的實(shí)例對(duì)象就變成了另外一個(gè)線程的偏向鎖
當(dāng)發(fā)生40次重定向時(shí),該類(lèi)的所有l(wèi)ock對(duì)象就變成了輕量級(jí)鎖。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Java創(chuàng)建隨機(jī)數(shù)的四種方式總結(jié)
這篇文章主要介紹了java的四種隨機(jī)數(shù)生成方式的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,,需要的朋友可以參考下2022-07-07Java SimpleDateFormat中英文時(shí)間格式化轉(zhuǎn)換詳解
這篇文章主要為大家詳細(xì)介紹了Java SimpleDateFormat中英文時(shí)間格式化轉(zhuǎn)換,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-12-12JavaWeb應(yīng)用實(shí)例:用servlet實(shí)現(xiàn)oracle 基本增刪改查
本篇文章主要介紹了JavaWeb應(yīng)用實(shí)例:用servlet實(shí)現(xiàn)oracle 基本增刪改查,非常具有實(shí)用價(jià)值,需要的朋友可以參考下。2017-01-01java應(yīng)用開(kāi)發(fā)之Mybatis通過(guò)Mapper代理自定義接口的實(shí)現(xiàn)
這篇文章主要介紹了java應(yīng)用開(kāi)發(fā)之Mybatis通過(guò)Mapper代理自定義接口的實(shí)現(xiàn)方式,有需要的朋友可以借鑒參考下,希望能夠有所幫助2021-09-09JAVA泛型的繼承和實(shí)現(xiàn)、擦除原理解析
這篇文章主要介紹了JAVA泛型的繼承和實(shí)現(xiàn)、擦除原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11idea2020.3測(cè)試評(píng)價(jià)及感受
idea2020.3版本這次變化最大的也就是 UI了完全拋棄了之前一直使用的模板更改成了新的樣式,感興趣的朋友快來(lái)下載體驗(yàn)下吧2020-10-10Springboot+Vue+axios實(shí)現(xiàn)文章收藏功能
這篇文章主要為大家詳細(xì)介紹了Springboot+Vue+axios實(shí)現(xiàn)文章收藏功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-08-08