1. 程式人生 > 其它 >Java 知識歸納 - 公平鎖和非公平鎖

Java 知識歸納 - 公平鎖和非公平鎖

公平鎖

多個執行緒按照申請鎖的順序去獲得鎖,執行緒會直接進入佇列去排隊,永遠都是佇列的第一位才能得到鎖。

優點:所有的執行緒都能得到資源,不會餓死在佇列中。
缺點:吞吐量會下降很多,佇列裡面除了第一個執行緒,其他的執行緒都會阻塞,CPU 喚醒阻塞執行緒的開銷會很大。

非公平鎖

多個執行緒去獲取鎖的時候,會直接去嘗試獲取,獲取不到,再去進入等待佇列,如果能獲取到,就直接獲取到鎖。

優點:可以減少 CPU 喚醒執行緒的開銷,整體的吞吐效率會高點。
缺點:可能導致佇列中間的執行緒一直獲取不到鎖或者長時間獲取不到鎖,導致餓死。

舉例

現在是早餐時間,敖丙想去 kfc 搞個早餐,發現有很多人了,一過去沒多想,就乖乖到隊尾排隊,這樣大家都覺得很公平,先到先得,所以這是公平鎖咯。那非公平鎖就是,敖丙過去買早餐,發現大家都在排隊,但是敖丙這個人有點渣的,就是喜歡插隊,那他就直接懟到第一位那去,後面的人也不敢說什麼,只能默默忍受了。但是偶爾,人會崛起,叫敖丙滾到後面排隊,敖丙就默默到後面排隊,就插隊失敗了。