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