公平锁:
解释:多个线程按照申请锁的顺序执行,先来后到。
优点:所有的线程都能得到资源,不会饿死在队列中。
缺点:吞吐量会下降很多,队列里面除了第一个线程,其他的线程都会阻塞,cpu唤醒阻塞线程的开销会很大。
非公平锁:
解释:多个线程不按照申请锁的顺序来,有可能先到后得。当非公平锁失败后才会采用公平锁。
优点:非公平锁性能高于公平锁性能,非公平锁能更充分的利用cpu的时间片,尽量的减少cpu空闲的状态时间。
缺点:可能导致队列中间的线程一直获取不到锁或者长时间获取不到锁,导致饿死或者优先级翻转。
公平锁和非公平锁的实现方式:
根据源码可以知道,ReentrantLock方法默认为非公平锁,FairSync和NonfairSync是ReentrantLock类中的两个静态内部类,它们都继承了Sync,Sync也是ReentrantLock类中的一个静态内部类。
公平锁和非公平锁的实现原理:
公平锁的实现原理在于每次有线程来抢占锁的时候,都会检查一遍有没有等待队列,如果有, 当前线程会执行如下步骤:
其中hasQueuedPredecessors是用于检查是否有等待队列的。如果是true则有排队情况,如果是false则没有排队情况。
非公平锁的实现原理在线程多次随机抢占,但是新的线程多次抢占失败后,会被加入到公平锁中,加入到公平锁进行等待后便和公平锁没有区别。
公平锁和非公平锁的释放:
公平锁和非公平锁都是ReentrantLock下面的unLock()通过sync.release()来释放锁机制.release之后还要调用unparkSuccessor() 方法唤醒后继结点。