公平锁和非公平锁

1.非公平锁

当锁占用状态为0时,所有线程共同通过CAS操作尝试获取锁,如果获取失败就将当前线程封装为一个节点追加在AQS的双向链表中。

2.公平锁

当锁占用状态为0时,会先判断当前线程节点是否是队列头节点,如果是则通过CAS操作获取锁,否则加入到等待队列。遵循先进先出原则,每一个先来的线程会先获取到锁,但是增加了线程的上下文切换和等待线程状态变换的时间,所以公平锁效率比非公平锁慢。

3.源码解析

在创建ReentranLock时默认非公平锁,公平锁和非公平锁分别使用了FariSync和NonFairSync方法实现。

    // 默认情况为非公平锁
    public ReentrantLock() {
        sync = new NonfairSync();
    }
    // 调用有参构造可以指定为公平锁
    public ReentrantLock(boolean fair) {
        sync = fair ? new FairSync() : new NonfairSync();
    }

公平锁源码:
 

    static final class FairSync extends Sync {
        private static final long serialVersionUID = -3000897897090466540L;

        final void lock() {
            acquire(1);
        }
        protected final boolean tryAcquire(int acquires) {

版权声明:本文为weixin_43442127原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。