ReentrantLock既可以实现公平锁也可以实现非公平锁,可以通过构造方法中的参数来指定。
public ReentrantLock(boolean fair) {
sync = fair ? new FairSync() : new NonfairSync();
}
下面一个例子可以测试一下Reentrantlock的公平锁与非公平锁的区别。大家可以改构造方法的参数即可。
public class TestLock {
private static final Lock lock = new ReentrantLock(true);
public static void main(String[] args) {
new Thread(() -> test(), "线程A").start();
new Thread(() -> test(), "线程B").start();
new Thread(() -> test(), "线程C").start();
new Thread(() -> test(), "线程D").start();
new Thread(() -> test(), "线程E").start();
}
private static void test() {
int times = 20;
for(int i=0; i < times; i++){
try {
lock.lock();
System.out.println(Thread.currentThread().getName() + "获取了锁");
TimeUnit.SECONDS.sleep(2);
}catch (InterruptedException e){
e.printStackTrace();
}finally {
lock.unlock();
}
}
}
}