Reentrantlock源码解析

原创 2016年05月31日 17:09:15

Reentrantlock及可重入锁,读源码首先要看下它的outline:
这里写图片描述
其核心就是公平锁fairSync和非公平送NonFairSync
我们可以看到这两个锁有共同的方法:lock();

  1. fairSync
 final void lock() {
            acquire(1);
        }
  1. NonfairSync
final void lock() {
            if (compareAndSetState(0, 1))
                setExclusiveOwnerThread(Thread.currentThread());
            else
                acquire(1);
        }

在资源没有被占用的情况下:

非公平锁是: 先state+1,然后直接得到锁,
而公平锁则是: 先尝试去获取锁,如果得到了锁则state+1.

如果是同一线程,再次申请锁

两种锁,表现基本一致,可以参考下面的代码块. (只是这段代码块在不同函数中)
fairSync:

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

NonfairSync

protected final boolean tryAcquire(int acquires) {
            return nonfairTryAcquire(acquires);
        }

如果是不同线程申请锁:

从业务逻辑来看,公平锁和非公平锁唯一的区别就是需要判断当前线程是不是链表头.但是一直有一点不明白的,在c==0的情况下, 不是就可以说明已经是表头了吗? 为什么还要检查 isFirst(current). compareAndSetState(0, acquires) 也可以保证在并发的情况下只有state=0才能获取锁.

总结

非公平锁,和公平锁只有在state=0的时候,业务逻辑不一样.
在stage=0的时候,非公平锁是直接获取锁,没有维护等待队列.
在stage=0的时候, 公平锁依然需要检查当前线程是否是等待队列的第一个.

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

java.util.concurrent包图文源码解析(二)——ReentrantLock

看这一篇时候先看第一篇,把类的继承关系弄清楚。java.util.concurrent包图文源码解析(一) ReentrantLock,意思就是可重入的锁,在JAVA环境下 ReentrantLoc...

ReentrantLock源码解析(三):总结

常用方式: int a = 12; //注意:通常情况下,这个会设置成一个类变量,比如说Segement中的段锁与copyOnWriteArrayList中的...

ReentrantLock源码解析

Lock特性lock接口提供synchronized关键字不具备的主要特性 特性 描述 尝试非阻塞的获取锁 当前线程尝试获取锁,如果这一时刻锁没有被其他线程获取到,则成功获取并持有锁 ...
  • juded
  • juded
  • 2017-05-26 11:09
  • 74

ReentrantLock源码解析

ReentrantLock是JDK内置的显示可重入锁,相对于隐式锁synchronized,ReentrantLock提供了比synchronized更精细化的锁控制

ReentrantLock源码解析

引言相信接触过java并发编程的对锁都不陌生,reentrantLock是锁的一种,可重入锁,本文将给出ReentrantLock的具体使用和相关源码分析。先看具体的使用吧:public class ...

ReentrantLock源码解析(二):释放锁unlock()

原文地址:http://www.cnblogs.com/java-zhao/p/5133402.html 最常用的方式: int a = 12; /...

Java 1.7 ReentrantLock源码解析

1.   简介     可重入锁是基于AQS实现的,和synchronized有相同的语义,同时有更多的扩展功能,比如可以tryLock和在指定时间内获取锁、响应中断获取锁等。典型用法如JDK 1....

第五章 ReentrantLock源码解析1--获得非公平锁与公平锁lock()

ReentrantLock源码解析1--获得非公平锁与公平锁lock() 最常用的方式:  View Code 1、对于ReentrantLock需要掌握以下几点 ReentrantLock的...

推荐: ReentrantLock源码之一lock方法解析(锁的获取)

一、前言     ReentrantLock是JDK1.5引入的,它拥有与synchronized相同的并发性和内存语义,并提供了超出synchonized的其他高级功能(例如,中断锁等候、条件变量等...

Java并发编程系列(五)----ReentrantLock源码解析

ReentrantLock有三个内部类Sync、FairSync、NonfairSync,主要类图关系用UML表示为: 首先看看成员变量 private final Sync sync;该变量表...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)