2024-08-04
版权声明:本文为博主付费文章,严禁任何形式的转载和摘抄,维权必究。 本文链接:https://www.skjava.com/mianshi/baodian/detail/1074199594

回答

从公平的角度来看 ,Java 的锁分为两类:公平锁和非公平锁。

公平锁

公平锁是指多个线程在尝试获取同一个锁时,锁会按照线程请求的顺序来分配。也就是说,谁先请求锁,谁就先获取锁。

公平锁的底层实现依赖于一个 FIFO 队列,当一个线程请求获取锁时,如果锁被其他线程占用,则该线程会被加入到等待队列的末尾。当锁被释放时,锁会从队列取出第一个等待的线程并将锁分配给它。

公平锁的优点在于它避免了线程饥饿问题,因为所有线程都有同等的获取锁的权利。但是,它性能相比于非公平锁是低的,因为它每次获取锁都需要维护一个队列,增加了额外的开销。

非公平锁

非公平锁是指多个线程在尝试获取同一个锁时,锁的分配不考虑请求顺序,谁抢到就是谁的。也就是说,任何一个请求锁的线程都有机会获取锁,哪怕它刚刚发起获取锁请求。

飞公平锁在尝试获取锁的时候,它是不需要考虑排队情况的,而是采取直接获取锁的方式,内部没有维护一个 FIFO 队列,减少了锁的开销,所以性能相对会高些。由于所有线程都有抢占锁的权利的,所以,有可能导致某些线程由于长时间获取不到锁而导致线程饥饿问题。