关于非公平锁的详细介绍可以参考之前的博客,有详细的源码分析:Lock非公平锁源码解读
为什么说非公平锁效率高于公平锁,我们先看源码
公平锁lock
final void lock() {
acquire(1);
}
/**
* Fair version of tryAcquire. Don't grant access unless
* recursive call or no waiters or is first.
*/
protected final boolean tryAcquire(int acquires) {
final Thread current = Thread.currentThread();
int c = getState();
if (c == 0) {
// 区别点:判断队列中是否有线程在等待
if (!hasQueuedPredecessors() &&
compareAndSetState(0, acquires)) {
setExclusiveOwnerThread(current);
return true;
}
}
else if (current == getExclusiveOwnerThread()) {
int nextc = c + acquires;
if (nextc < 0)
throw new Error("Maximum lock count exceeded");
setState(nextc);
return true;
}
return false;
}
非公平锁lock
final void lock() {
// 一上来就尝试获取锁,减少进入等待队列,减少park,减少用户态和内核态的切换,从而提高性能。
if (compareAndSetState(0, 1))
setExclusiveOwnerThread(Thread.currentThread());
else
acquire(1);
}
非公平锁区公平锁的区别是什么??
- 非公平锁,不讲武德,一上来就“干”,不管有没有人排队,一上来就尝试获取锁。
- 公平锁,先看队列中有没有其他线程在排队,同时也意味着,线程park可能性更多,更浪费性能。
- 非公平锁缺点,有可能一个线程长期获取不到锁,部分场景不适用,比如公平抢票场景。
why???为什么说非公平锁性能高于公平锁
简单讲,就是因为非公平锁不讲武德这种方式,减少了park,减少了用户态和内核态的切换,从而提高性能。