摘要:在并發(fā)編程學(xué)習(xí)之顯示鎖里有提過(guò)公平鎖和非公平鎖,我們知道他的使用方式,以及非公平鎖的性能較高,在源碼分析的基礎(chǔ)上,我們看看和的區(qū)別在什么地方。而非公平鎖直接嘗試獲取鎖。
在java并發(fā)編程學(xué)習(xí)之顯示鎖Lock里有提過(guò)公平鎖和非公平鎖,我們知道他的使用方式,以及非公平鎖的性能較高,在AQS源碼分析的基礎(chǔ)上,我們看看NonfairSync和FairSync的區(qū)別在什么地方。
lock方法//非公平鎖NonfairSync final void lock() { if (compareAndSetState(0, 1)) setExclusiveOwnerThread(Thread.currentThread()); else acquire(1); } //公平鎖FairSync final void lock() { acquire(1); }
從源碼可以看出,獲取鎖的時(shí)候,非公平鎖會(huì)先嘗試獲取,獲取不到再調(diào)用acquire方法,而公平鎖直接調(diào)用acquire方法。
tryAcquire方法////非公平鎖NonfairSync protected final boolean tryAcquire(int acquires) { return nonfairTryAcquire(acquires); } final boolean nonfairTryAcquire(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) // overflow throw new Error("Maximum lock count exceeded"); setState(nextc); return true; } return false; } ////公平鎖FairSync protected final boolean tryAcquire(int acquires) { final Thread current = Thread.currentThread(); int c = getState();//無(wú)線程占用 if (c == 0) { if (!hasQueuedPredecessors() &&//看是否有前面節(jié)點(diǎn)在等待 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; }
從源碼可以看出,公平鎖再嘗試獲取鎖的時(shí)候,先判斷隊(duì)列是否有其他節(jié)點(diǎn)在等待,沒(méi)有再獲取。而非公平鎖直接嘗試獲取鎖。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/77909.html
摘要:顯示鎖和內(nèi)置鎖內(nèi)置鎖優(yōu)勢(shì)代碼簡(jiǎn)潔不會(huì)因?yàn)闆](méi)釋放鎖,導(dǎo)致鎖泄露。顯示鎖優(yōu)勢(shì)靈活性強(qiáng),鎖的獲取可以被中斷,可以嘗試獲取鎖。接口接口主要方法如下獲取鎖嘗試獲取鎖,表示未加鎖的情況。會(huì)進(jìn)行搶鎖操作,如果獲取不到鎖,也會(huì)進(jìn)入阻塞隊(duì)列等到喚醒。 顯示鎖和內(nèi)置鎖 內(nèi)置鎖(Synchronized)優(yōu)勢(shì) 代碼簡(jiǎn)潔 不會(huì)因?yàn)闆](méi)釋放鎖,導(dǎo)致鎖泄露。 顯示鎖(Lock)優(yōu)勢(shì) 靈活性強(qiáng),鎖的獲取可以被中...
摘要:公平鎖為了保證時(shí)間上的絕對(duì)順序,需要頻繁的上下文切換,而非公平鎖會(huì)降低一定的上下文切換,降低性能開(kāi)銷。因此,默認(rèn)選擇的是非公平鎖,則是為了減少一部分上下文切換,保證了系統(tǒng)更大的吞吐量。ReentrantLock簡(jiǎn)介ReentrantLock重入鎖,是實(shí)現(xiàn)Lock接口的一個(gè)類,也是在實(shí)際編程中使用頻率很高的一個(gè)鎖, 支持重入性,表示能夠?qū)蚕碣Y源能夠重復(fù)加鎖,即當(dāng)前線程獲取該鎖再次獲取不會(huì)被阻...
摘要:公平鎖為了保證時(shí)間上的絕對(duì)順序,需要頻繁的上下文切換,而非公平鎖會(huì)降低一定的上下文切換,降低性能開(kāi)銷。因此,默認(rèn)選擇的是非公平鎖,則是為了減少一部分上下文切換,保證了系統(tǒng)更大的吞吐量。ReentrantLock簡(jiǎn)介ReentrantLock重入鎖,是實(shí)現(xiàn)Lock接口的一個(gè)類,也是在實(shí)際編程中使用頻率很高的一個(gè)鎖, 支持重入性,表示能夠?qū)蚕碣Y源能夠重復(fù)加鎖,即當(dāng)前線程獲取該鎖再次獲取不會(huì)被阻...
摘要:公平鎖為了保證時(shí)間上的絕對(duì)順序,需要頻繁的上下文切換,而非公平鎖會(huì)降低一定的上下文切換,降低性能開(kāi)銷。因此,默認(rèn)選擇的是非公平鎖,則是為了減少一部分上下文切換,保證了系統(tǒng)更大的吞吐量。ReentrantLock簡(jiǎn)介ReentrantLock重入鎖,是實(shí)現(xiàn)Lock接口的一個(gè)類,也是在實(shí)際編程中使用頻率很高的一個(gè)鎖, 支持重入性,表示能夠?qū)蚕碣Y源能夠重復(fù)加鎖,即當(dāng)前線程獲取該鎖再次獲取不會(huì)被阻...
摘要:的主要功能和關(guān)鍵字一致,均是用于多線程的同步。而僅支持通過(guò)查詢當(dāng)前線程是否持有鎖。由于和使用的是同一把可重入鎖,所以線程可以進(jìn)入方法,并再次獲得鎖,而不會(huì)被阻塞住。公平與非公平公平與非公平指的是線程獲取鎖的方式。 1.簡(jiǎn)介 可重入鎖ReentrantLock自 JDK 1.5 被引入,功能上與synchronized關(guān)鍵字類似。所謂的可重入是指,線程可對(duì)同一把鎖進(jìn)行重復(fù)加鎖,而不會(huì)被阻...
閱讀 2646·2021-11-25 09:43
閱讀 2433·2021-09-22 15:29
閱讀 966·2021-09-22 15:17
閱讀 3587·2021-09-03 10:36
閱讀 2203·2019-08-30 13:54
閱讀 1723·2019-08-30 11:23
閱讀 1146·2019-08-29 16:58
閱讀 1274·2019-08-29 16:14