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同步、锁机制我们主要讲解了关于synchronized的实现和各种锁的类型,本节将尝试从源码的角度去理解可重入锁ReentrantLock的实现。由于个人水平有限,文中出现错误的地方还...
  • tangyongzhe
  • tangyongzhe
  • 2015年03月13日 21:41
  • 2217

《Java源码分析》:ReentrantLock.lock 锁机制

《Java源码分析》:ReentrantLock.lock 锁机制AbstractQueuedSynchronizer这个类真的很难也很复杂,是构建锁以及实现其他相关同步类的基础框架。本来是没有打算...
  • u010412719
  • u010412719
  • 2016年08月01日 10:47
  • 1776

Reentrantlock源码解析

Reentrantlock及可重入锁,读源码首先要看下它的outline: 其核心就是公平锁fairSync和非公平送NonFairSync 我们可以看到这两个锁有共同的方法:lock(); ...
  • wangdan199112
  • wangdan199112
  • 2016年05月31日 17:09
  • 476

ReentrantLock源码分析

ReentrantLock是Java并发包中提供的一个可重入的互斥锁。ReentrantLock和synchronized在基本用法,行为语义上都是类似的,同样都具有可重入性。只不过相比原生的Sync...
  • Rchengzhi
  • Rchengzhi
  • 2018年01月30日 11:05
  • 7

JDK1.8中ReentrantLock源码分析

JDK1.8源码分析之ReentrantLock
  • kangxiongwei
  • kangxiongwei
  • 2017年05月18日 15:09
  • 377

JDK源码研究——ReentrantLock浅析

本文简单地介绍一下从JDK1.5开始引入的java.util.concurrent(简称J.U.C)包下的ReentrantLock类。Reentrant的英文含义是“可重入的”,也就是说Reentr...
  • xialei199023
  • xialei199023
  • 2015年09月27日 12:34
  • 682

ReentrantLock源码分析(JDK 1.7)

eentrantLock是一个可重入的互斥锁(独占锁),它和隐式锁(使用Synchronized修饰的方法)一样有着相同的功能和语义。但是ReentrantLock还扩展了一些特别功能。Reentra...
  • wojiaolinaaa
  • wojiaolinaaa
  • 2015年12月22日 22:28
  • 925

ReentrantLock实现原理及源码分析

ReentrantLock是Java并发包中提供的一个可重入的互斥锁。ReentrantLock和synchronized在基本用法,行为语义上都是类似的,同样都具有可重入性。只不过相比原生的Sync...
  • ios99999
  • ios99999
  • 2017年08月09日 11:53
  • 178

java并发锁ReentrantLock源码分析二之Condition实现原理

本文深入分析了并发锁ReentrantLock Condtion的实现原理,一个很重要的关键是await先释放锁,然后阻塞,在条件队列中等待被唤醒,每个CondtionObject维护着一个条件队列,...
  • prestigeding
  • prestigeding
  • 2016年11月14日 13:55
  • 2024

ReentrantLock源码解析

引言相信接触过java并发编程的对锁都不陌生,reentrantLock是锁的一种,可重入锁,本文将给出ReentrantLock的具体使用和相关源码分析。先看具体的使用吧:public class ...
  • u010185262
  • u010185262
  • 2016年12月01日 15:20
  • 367
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Reentrantlock源码解析
举报原因:
原因补充:

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