摘要:很吧判斷是否有前驅(qū)線程等待獲取鎖公平所和非公平鎖的各自?xún)?yōu)勢(shì)是什么那公平鎖很好理解,可以防止出現(xiàn)線程饑餓現(xiàn)象,每一個(gè)線程都有機(jī)會(huì)獲取到鎖。非公平鎖可能會(huì)導(dǎo)致線程饑餓,但是我們一般使用非公平鎖,因?yàn)榉枪芥i可以減少上下文的切換,提高效率。
鎖的重入是指同一個(gè)線程可以多次獲取同一個(gè)鎖,synchronize是隱式的可重入鎖,ReentrantLock通過(guò)代碼實(shí)現(xiàn)了鎖的重入:
final boolean nofairTryAcquire(int acquires){ final Thread current=Thread.currentThread(); int c=getState(); if(c==0){ if(compareAndSetState(0,acquires)){ setExclusiveOwnerThread(current); return true; } }else if(current==getExclusiveOwnerThread()){ int nextc=c+acquires; if(nextc<0) throw new Error("Maximum lock count exceeded"); setState(nextc); return true; } return false; }
從上面的代碼中,可以一目了然的發(fā)現(xiàn),當(dāng)獲取鎖的線程與擁有鎖的線程是同一個(gè)線程時(shí),僅會(huì)對(duì)狀態(tài)進(jìn)行累加。so easy ,并沒(méi)有什么難度。那接下來(lái)我們想一下,如何實(shí)現(xiàn)公平所和非公平鎖,上面的代碼是非公平鎖的實(shí)現(xiàn)方式。那如何實(shí)現(xiàn)公平鎖那?所謂的公平鎖就是所有獲取鎖的線程都要按照“先來(lái)后到”的順序獲取鎖。假設(shè)線程B在阻塞隊(duì)列中,等待獲取鎖,如果還有一個(gè)線程A在B的前面,那么B就要讓A先獲取鎖。因此在B嘗試獲取鎖之前,只要判斷一下它是否還有前驅(qū)的隊(duì)列即可。很easy吧:
final boolean fairTryAcquire(int acquires){ final Thread current=Thread.currentThread(); int c=getState(); if(c==0){ if(!hasQueuedPredecessors()&&compareAndSetState(0,acquires)){//判斷是否有前驅(qū)線程等待獲取鎖 setExclusiveOwnerThread(current); return true; } }else if(current==getExclusiveOwnerThread()){ int nextc=c+acquires; if(nextc<0) throw new Error("Maximum lock count exceeded"); setState(nextc); return true; } return false; }
公平所和非公平鎖的各自?xún)?yōu)勢(shì)是什么那?公平鎖很好理解,可以防止出現(xiàn)線程饑餓現(xiàn)象,每一個(gè)線程都有機(jī)會(huì)獲取到鎖。非公平鎖可能會(huì)導(dǎo)致線程饑餓,但是我們一般使用非公平鎖,因?yàn)榉枪芥i可以減少上下文的切換,提高效率。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/72822.html
摘要:的主要功能和關(guān)鍵字一致,均是用于多線程的同步。而僅支持通過(guò)查詢(xún)當(dāng)前線程是否持有鎖。由于和使用的是同一把可重入鎖,所以線程可以進(jìn)入方法,并再次獲得鎖,而不會(huì)被阻塞住。公平與非公平公平與非公平指的是線程獲取鎖的方式。 1.簡(jiǎn)介 可重入鎖ReentrantLock自 JDK 1.5 被引入,功能上與synchronized關(guān)鍵字類(lèi)似。所謂的可重入是指,線程可對(duì)同一把鎖進(jìn)行重復(fù)加鎖,而不會(huì)被阻...
摘要:二什么是重入鎖可重入鎖,顧名思義,支持重新進(jìn)入的鎖,其表示該鎖能支持一個(gè)線程對(duì)資源的重復(fù)加鎖。將由最近成功獲得鎖,并且還沒(méi)有釋放該鎖的線程所擁有。可以使用和方法來(lái)檢查此情況是否發(fā)生。 一、寫(xiě)在前面 前幾篇我們具體的聊了AQS原理以及底層源碼的實(shí)現(xiàn),具體參見(jiàn) 《J.U.C|一文搞懂AQS》《J.U.C|同步隊(duì)列(CLH)》《J.U.C|AQS獨(dú)占式源碼分析》《J.U.C|AQS共享式源...
摘要:本文旨在對(duì)鎖相關(guān)源碼本文中的源碼來(lái)自使用場(chǎng)景進(jìn)行舉例,為讀者介紹主流鎖的知識(shí)點(diǎn),以及不同的鎖的適用場(chǎng)景。中,關(guān)鍵字和的實(shí)現(xiàn)類(lèi)都是悲觀鎖。自適應(yīng)意味著自旋的時(shí)間次數(shù)不再固定,而是由前一次在同一個(gè)鎖上的自旋時(shí)間及鎖的擁有者的狀態(tài)來(lái)決定。 前言 Java提供了種類(lèi)豐富的鎖,每種鎖因其特性的不同,在適當(dāng)?shù)膱?chǎng)景下能夠展現(xiàn)出非常高的效率。本文旨在對(duì)鎖相關(guān)源碼(本文中的源碼來(lái)自JDK 8)、使用場(chǎng)景...
摘要:公平鎖為了保證時(shí)間上的絕對(duì)順序,需要頻繁的上下文切換,而非公平鎖會(huì)降低一定的上下文切換,降低性能開(kāi)銷(xiāo)。因此,默認(rèn)選擇的是非公平鎖,則是為了減少一部分上下文切換,保證了系統(tǒng)更大的吞吐量。ReentrantLock簡(jiǎn)介ReentrantLock重入鎖,是實(shí)現(xiàn)Lock接口的一個(gè)類(lèi),也是在實(shí)際編程中使用頻率很高的一個(gè)鎖, 支持重入性,表示能夠?qū)蚕碣Y源能夠重復(fù)加鎖,即當(dāng)前線程獲取該鎖再次獲取不會(huì)被阻...
摘要:公平鎖為了保證時(shí)間上的絕對(duì)順序,需要頻繁的上下文切換,而非公平鎖會(huì)降低一定的上下文切換,降低性能開(kāi)銷(xiāo)。因此,默認(rèn)選擇的是非公平鎖,則是為了減少一部分上下文切換,保證了系統(tǒng)更大的吞吐量。ReentrantLock簡(jiǎn)介ReentrantLock重入鎖,是實(shí)現(xiàn)Lock接口的一個(gè)類(lèi),也是在實(shí)際編程中使用頻率很高的一個(gè)鎖, 支持重入性,表示能夠?qū)蚕碣Y源能夠重復(fù)加鎖,即當(dāng)前線程獲取該鎖再次獲取不會(huì)被阻...
閱讀 1860·2023-04-25 14:33
閱讀 3452·2021-11-22 15:22
閱讀 2250·2021-09-30 09:48
閱讀 2802·2021-09-14 18:01
閱讀 1793·2019-08-30 15:55
閱讀 3064·2019-08-30 15:53
閱讀 2214·2019-08-30 15:44
閱讀 717·2019-08-30 10:58