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,减少了用户态和内核态的切换,从而提高性能。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容