ReentrantLock实现了Lock接口,在加锁和解锁时都要显示的写出,当构造ReentrantLock传入的参数为false的时候为非公平锁,当构造ReentrantLock传入参数为true的时候为公平锁。
//创建一个非公平锁,默认是非公平锁
Lock nonFairLock= new ReentrantLock();
Lock nonFairLock= new ReentrantLock(false);
//创建一个公平锁,构造传参true
Lock fairLock= new ReentrantLock(true);
公平锁:
按照线程的先后顺序来获取锁(FIFO机制)。在加锁前先查看队列前是否有排队等待的线程,如果有,则等待前面线程释放锁以后才能获取锁,先来先到。
非公平锁:
并非按照线程的先后顺序来访问来获取锁,而是直接尝试获取锁。
适用场景
更多的是直接使用非公平锁:非公平锁比公平锁性能高5-10倍,因为公平锁需要在多核情况下维护一个队列,如果当前线程不是队列的第一个无法获取锁,增加了线程切换次数。