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的时候, 公平锁依然需要检查当前线程是否是等待队列的第一个.

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

ReentrantLock源码解析

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

第六章 ReentrantLock源码解析2--释放锁unlock()

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

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

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

ReentrantLock源码解析(三):总结

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

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

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

Java 1.7 ReentrantLock源码解析

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

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

ReentrantLock有三个内部类Sync、FairSync、NonfairSync,主要类图关系用UML表示为: 首先看看成员变量 private final Sync sync;该变量表...

深度解析ReentrantLock源码

一、ReentrantLock数据结构 ReentrantLock的底层是借助AbstractQueuedSynchronizer实现,所以其数据结构依附于AbstractQueuedS...
  • pfnie
  • pfnie
  • 2016年12月10日 17:44
  • 296

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

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

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

ReentrantLock源码解析1--获得非公平锁与公平锁lock() 最常用的方式:  View Code 1、对于ReentrantLock需要掌握以下几点 ReentrantLock的...
  • a724888
  • a724888
  • 2017年03月16日 11:21
  • 592
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Reentrantlock源码解析
举报原因:
原因补充:

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