Lock公平锁与非公平锁源码对比解读

关于非公平锁的详细介绍可以参考之前的博客,有详细的源码分析: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);
}

非公平锁区公平锁的区别是什么??

  1. 非公平锁,不讲武德,一上来就“干”,不管有没有人排队,一上来就尝试获取锁。
  2. 公平锁,先看队列中有没有其他线程在排队,同时也意味着,线程park可能性更多,更浪费性能。
  3. 非公平锁缺点,有可能一个线程长期获取不到锁,部分场景不适用,比如公平抢票场景。

why???为什么说非公平锁性能高于公平锁

简单讲,就是因为非公平锁不讲武德这种方式,减少了park,减少了用户态和内核态的切换,从而提高性能。

你可能感兴趣的:(Lock公平锁与非公平锁源码对比解读)