網(wǎng)站建設(shè)公司排行榜搜索引擎優(yōu)化內(nèi)容包括哪些方面
我先解釋一下個(gè)公平和非公平的概念。
-
公平,指的是競(jìng)爭(zhēng)鎖資源的線程,嚴(yán)格按照請(qǐng)求順序來分配鎖。
-
非公平,表示競(jìng)爭(zhēng)鎖資源的線程,允許插隊(duì)來搶占鎖資源。
ReentrantLock
默認(rèn)采用了非公平鎖的策略來實(shí)現(xiàn)鎖的競(jìng)爭(zhēng)邏輯。
其次,ReentrantLock
內(nèi)部使用了AQS來實(shí)現(xiàn)鎖資源的競(jìng)爭(zhēng),沒有競(jìng)爭(zhēng)到鎖資源的線程,會(huì)加入到AQS的同步隊(duì)列里面,這個(gè)隊(duì)列是一個(gè)FIFO的雙向鏈表。
在這樣的一個(gè)背景下,公平鎖的實(shí)現(xiàn)方式就是,線程在競(jìng)爭(zhēng)鎖資源的時(shí)候判斷AQS同步隊(duì)列里面有沒有等待的線程。
如果有,就加入到隊(duì)列的尾部等待。
而非公平鎖的實(shí)現(xiàn)方式,就是不管隊(duì)列里面有沒有線程等待,它都會(huì)先去嘗試搶占鎖資源,如果搶不到,再加入到AQS同步隊(duì)列等待。
ReentrantLock
和Synchronized
默認(rèn)都是非公平鎖的策略,之所以要這么設(shè)計(jì),我認(rèn)為還是考慮到了性能這個(gè)方面的原因。
因?yàn)橐粋€(gè)競(jìng)爭(zhēng)鎖的線程如果按照公平的策略去阻塞等待,同時(shí)AQS再把等待隊(duì)列里面的線程喚醒,這里會(huì)涉及到內(nèi)核態(tài)的切換,對(duì)性能的影響比較大。
如果是非公平策略,當(dāng)前線程正好在上一個(gè)線程釋放鎖的臨界點(diǎn)搶占到了鎖,就意味著這個(gè)線程不需要切換到內(nèi)核態(tài),雖然對(duì)原本應(yīng)該要被喚醒的線程不公平,但是提升了鎖競(jìng)爭(zhēng)的性能。
參考
談?wù)凧ava多線程離不開的AQS