码迷,mamicode.com
首页 > 其他好文 > 详细

ReentrantLock

时间:2020-04-21 15:19:37      阅读:56      评论:0      收藏:0      [点我收藏+]

标签:非公平锁   version   控制   object   对象   基本   syn   next   false   

ReentrantLock

1 数据结构

技术图片

从上图可以看出,ReentrantLock的功能都是通过sync这个对象提供的。

public class ReentrantLock implements Lock, java.io.Serializable {
    private final Sync sync;
}

2 获取锁是否要走公平非公平逻辑

  • 区分公平非公平锁,公平锁老实排队
    • lock
    • lockInterruptibly
    • tryLock(long timeout, TimeUnit unit)
  • 不区分是否公平,如果锁可获取就去竞争
    • tryLock()

3 源码解析

/**
 * 锁的同步控制的基础,抽象类提供了基本处理框架,具体逻辑由子类实现
 * 使用AQS的状态作为持有锁的数目
 */
abstract static class Sync extends AbstractQueuedSynchronizer {
    private static final long serialVersionUID = -5179523762034025860L;

    abstract void lock();

    // 执行非公平trylock
    final boolean nonfairTryAcquire(int acquires) {
        final Thread current = Thread.currentThread();
        int c = getState();
        if (c == 0) {
            if (compareAndSetState(0, acquires)) {
                setExclusiveOwnerThread(current);
                return true;
            }
        }
        else if (current == getExclusiveOwnerThread()) {
            int nextc = c + acquires;
            if (nextc < 0) // overflow
                throw new Error("Maximum lock count exceeded");
            setState(nextc);
            return true;
        }
        return false;
    }

    // 释放
    protected final boolean tryRelease(int releases) {
        int c = getState() - releases;
        if (Thread.currentThread() != getExclusiveOwnerThread())
            throw new IllegalMonitorStateException();
        boolean free = false;
        if (c == 0) {
            free = true;
            setExclusiveOwnerThread(null);
        }
        setState(c);
        return free;
    }

    // 检查当前线程是不是持有锁
    protected final boolean isHeldExclusively() {
        return getExclusiveOwnerThread() == Thread.currentThread();
    }

    // 条件
    final ConditionObject newCondition() {
        return new ConditionObject();
    }

    // 获取持有锁的线程
    final Thread getOwner() {
        return getState() == 0 ? null : getExclusiveOwnerThread();
    }

    // 获取持有锁的次数
    final int getHoldCount() {
        return isHeldExclusively() ? getState() : 0;
    }

    // 是否加锁了
    final boolean isLocked() {
        return getState() != 0;
    }
}

ReentrantLock

标签:非公平锁   version   控制   object   对象   基本   syn   next   false   

原文地址:https://www.cnblogs.com/zerodsLearnJava/p/12744370.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!