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

ReentrantLock源码分析-JDK1.8

时间:2020-01-23 21:13:45      阅读:74      评论:0      收藏:0      [点我收藏+]

标签:ued   ransient   类的继承   说明   syn   final   volatil   prot   ant   

浅析JDK1.8 ReentrantLock源码。

写在开篇
ReentrantLock–重入锁,是实现Lock接口的一个同步组件。这篇文章建立在熟悉AQS源码的基础上,同时主要从两个方面来分析ReentrantLock:

重入性的实现原理
公平锁和非公平锁
类的继承关系
ReentrantLock实现了Lock和Serializable接口。

public class ReentrantLock implements Lock, java.io.Serializable {
成员变量

/**

  • ReentrantLock通过sync(AQS的子类)来实现锁
    */
    private final Sync sync;
    这里再说明一下ReentrantLock语境下,AQS的成员变量:

/**

  • state用来表示该锁被线程重入的次数。
  • 0表示该锁不被任何线程持有
  • 1表示线程恰好持有该锁1次(未重入)
  • 大于1则表示锁被线程重入state次
    */
    private volatile int state;

/**

  • 标识锁被哪个线程持有
    */
    private transient Thread exclusiveOwnerThread;
    静态内部类
    Sync也是一个抽象类,因为锁有非公平和公平的区别。

abstract static class Sync extends AbstractQueuedSynchronizer {
private static final long serialVersionUID = -5179523762034025860L;

/**
     * 非公平和公平锁的lock()方法有不同的实现。
     */
abstract void lock();

/**
     * 非公平的独占锁获取同步状态
     */
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;
}

}
构造方法

/**
* 默认构造非公平锁
*/
public ReentrantLock() {
sync = new NonfairSync();
}

/**
* @param fair true构造公平锁,false构造非公平锁
*/
public ReentrantLock(boolean fair) {
sync = fair ? new FairSync() : new NonfairSync();
}
非公平锁
非公平模式加锁流程
加锁流程从lock.lock()开始

public void lock() {
sync.lock();
}

ReentrantLock源码分析-JDK1.8

标签:ued   ransient   类的继承   说明   syn   final   volatil   prot   ant   

原文地址:https://www.cnblogs.com/kyrie17/p/12231156.html

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