1、偏向鎖:無實際競爭,只有第一個申請鎖的線程會使用鎖 偏向鎖會偏向第一個獲得它的線程。當(dāng)線程獲取鎖的時候,先檢查Mark Word是否是可偏向鎖的狀態(tài)。
海城網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)!從網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、響應(yīng)式網(wǎng)站開發(fā)等網(wǎng)站項目制作,到程序開發(fā),運營維護。創(chuàng)新互聯(lián)2013年開創(chuàng)至今到現(xiàn)在10年的時間,我們擁有了豐富的建站經(jīng)驗和運維經(jīng)驗,來保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)。
2、偏向鎖/輕量級鎖/重量級鎖 這三種鎖是指鎖的狀態(tài),并且是針對Synchronized。在Java 5通過引入鎖升級的機制來實現(xiàn)高效Synchronized。這三種鎖的狀態(tài)是通過對象監(jiān)視器在對象頭中的字段來表明的。
3、這三種鎖效率從高到低:偏向鎖,輕量級鎖,重量級鎖 重量級鎖:使用的是linux的互斥量mutex實現(xiàn)。非常耗資源 輕量級鎖(自旋鎖):使用cas來實現(xiàn)鎖。使用與線程交替訪問資源的情況,可以減少mutex的使用。
1、自旋鎖 自旋鎖是采用讓當(dāng)前線程不停地的在循環(huán)體內(nèi)執(zhí)行實現(xiàn)的,當(dāng)循環(huán)的條件被其他線程改變時 才能進(jìn)入臨界區(qū)。
2、1) 支持公平鎖,某些場景下需要獲得鎖的時間與申請鎖的時間相一致,但是synchronized做不到 2) 支持中斷處理,就是說那些持有鎖的線程一直不釋放,正在等待的線程可以放棄等待。
3、對于Java ReentrantLock而言,通過構(gòu)造函數(shù)指定該鎖是否是公平鎖,默認(rèn)是非公平鎖。對于Synchronized而言,也是一種非公平鎖。由于其并不像ReentrantLock是通過AQS的來實現(xiàn)線程調(diào)度,所以并沒有任何辦法使其變成公平鎖。
4、樂觀鎖和悲觀鎖的區(qū)別如下:悲觀鎖是當(dāng)線程拿到資源時,就對資源上鎖,并在提交后,才釋放鎖資源,其他線程才能使用資源。
5、對于Java ReentrantLock而言,其是獨享鎖。但是對于Lock的另一個實現(xiàn)類ReadWriteLock,其讀鎖是共享鎖,其寫鎖是獨享鎖。讀鎖的共享鎖可保證并發(fā)讀是非常高效的,讀寫,寫讀 ,寫寫的過程是互斥的。
6、block的時候調(diào)用此對象的同步方法或進(jìn)入其同步區(qū)域時,就必須先獲得對象鎖。
JDK6出現(xiàn)的新型鎖,6之前的叫“傳統(tǒng)鎖”,是利用操作系統(tǒng)互斥來實現(xiàn)的(消耗系統(tǒng)資源)。輕量級的鎖并不能替代傳統(tǒng)鎖,它的作用是在沒有多線程競爭的前提下,減少傳統(tǒng)鎖(重量級鎖)使用,達(dá)到減少性能消耗的目的。
synchronized鎖僅可用于解決同一進(jìn)程內(nèi)不同線程間同步,對于分布式項目跨進(jìn)城線程同步依賴于分布式鎖,synchronized鎖更多的意義是理解鎖的過程。
非公平鎖是指多個線程獲取鎖的順序并不是按照申請鎖的順序,有可能后申請的線程比先申請的線程優(yōu)先獲取鎖。有可能,會造成優(yōu)先級反轉(zhuǎn)或者饑餓現(xiàn)象。
Synchronized是Java中解決并發(fā)問題的一種最常用的方法,也是最簡單的一種方法。
輕量級鎖考慮的是競爭鎖對象的線程不多,而且線程持有鎖的時間也不長的情景。