可重入锁 ReentrantLock 源码解读(1)简介

来源:互联网 发布:烘焙软件哪个好 编辑:程序博客网 时间:2024/05/21 15:02

何谓可重入锁:顾名思义--若是在同一个线程上请求锁,则允许获得锁并继续执行代码。否则线程阻塞等待unlock

reentrantLock 是一种独占锁--线程独占

按公平性来分:reentrantLock可分为公平锁和非公平锁

ReentrantLock的构造函数:

    public ReentrantLock() {
        sync = new NonfairSync();
    }

    public ReentrantLock(boolean fair) {
        sync = (fair)? new FairSync() : new NonfairSync();
    }

 创建公平锁或非公平锁---公平锁与非公平锁的区别在于,公平锁总是按照等待锁进入队列的顺序,进行解锁的,而非公平锁总是直接检查当前线程是否可获得锁,若当前线程可获得锁,则在等待队列之前先获得锁

 二者的实现仅有tryAcquire()不同

 公平锁:

         protected final boolean tryAcquire(int acquires) {
            final Thread current = Thread.currentThread();
            int c = getState();
            if (c == 0) {
                if (isFirst(current) &&
                    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;
        }

非公平锁:

         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;
        }



原创粉丝点击