ReetrantLock   内部静态类  Sync  继承AbstractQueuedSynchronizer(负责阻塞队列,线程去枪战锁,并且包含了node)

NonfairSync  extends Sync extends AbstractQueuedSynchronizer

FairSync extends Sync extends AbstractQueuedSynchronizer

AbstractQueuedSynchronizer 中有一个模板方法 tryacquire(模板模式)

非公平锁NonfairSync

final void lock() {

    //直接枪占啊。基于cas保证state操作在并发的时候是正确的
            if (compareAndSetState(0, 1))
                setExclusiveOwnerThread(Thread.currentThread());
            else
                acquire(1);
        }

公平锁FairSync
        final void lock() {
            acquire(1);
        }

acquire的方法 是在AbstractQueuedSynchronizer中实现的

public final void acquire(int arg) {

//addWaiter是加入到队列尾巴 吧线程封装成node  acquireQueued里面又做了循环。所有线程去抢占锁。至于里面的对线程的状态的切换不用关系
        if (!tryAcquire(arg) &&
            acquireQueued(addWaiter(Node.EXCLUSIVE), arg))
            selfInterrupt();
    }

tryAcquire 在AbstractQueuedSynchronizer 只是实现了个方法

protected boolean tryAcquire(int arg) {
        throw new UnsupportedOperationException();
    }

具体的实现分别在NonfairSync  FairSync

前者

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

转载于:https://www.cnblogs.com/tecnologycc/p/10174689.html

关于ReetrantLock相关推荐

  1. Java synchronized 与 lock (Reetrantlock)锁性能比较

    使用synchronzied和ReetrantLock做一百万次自增运算性能比较,比较一个线程和多线程情况下 package com.lock.test; public class LockValue ...

  2. 非公平锁和公平锁在reetrantlock里的实现过程是怎样的

    ● 请讲一下非公平锁和公平锁在reetrantlock里的实现过程是怎样的. 考察点:锁 参考回答: 如果一个锁是公平的,那么锁的获取顺序就应该符合请求的绝对时间顺序,FIFO.对于非公平锁,只要CA ...

  3. synchronized,ReetrantLock与volatile(二)

    为什么80%的码农都做不了架构师?>>>    volatile       Volatile 变量具有 synchronized 的可见性特性,但是不具备原子特性.这就是说线程能够 ...

  4. 深入剖析基于并发AQS的(独占锁)重入锁(ReetrantLock)及其Condition实现原理

    [版权申明]未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) http://blog.csdn.net/javazejian/article/details/75043422 出自[zejian ...

  5. ReetrantLock 源码解析(UML图版)

    废话不说,上图: PS:绘图工具用的是idea插件: PlantUML integration(idea插件网上五星好评的那个.)本来想用泳道图的,但用starUML不好上手,这个插件有官方教程,语法 ...

  6. synchronized与ReetrantLock的区别

    synchronized与ReetrantLock的区别(个人见解,如果不对,请勿喷) 相同之处: 1.两者都是同时实现了锁的功能 2.两者都是可重入锁 不同之处: (1)synchronized是独 ...

  7. java高并发(十四)ReetrantLock 与锁

    java主要分两类锁,一种是synchronized关键字修饰的锁,另一种是J.U.C.提供的锁.J.U.C里核心锁就是ReentrantLock ReentrantLock(可重入锁)和synchr ...

  8. ReentrantLock与synchronized

    1.ReentrantLock 拥有Synchronized相同的并发性和内存语义,此外还多了 锁投票,定时锁等候和中断锁等候线程A和B都要获取对象O的锁定,假设A获取了对象O锁,B将等待A释放对O的 ...

  9. Http持久连接与HttpClient连接池

    以下文章来源方志朋的博客,回复"666"获面试宝典 一.背景 HTTP协议是无状态的协议,即每一次请求都是互相独立的.因此它的最初实现是,每一个http请求都会打开一个tcp so ...

最新文章

  1. CSS3——transform
  2. 库函数和系统调用的区别
  3. 【Spring】Spring高级话题-@Enable***注解的工作原理
  4. Idea中在代码顶部添加自定义作者和时间
  5. 笔记:Microservices for Java Developers
  6. 【Siddhi】Siddhi 如何表示布尔 Syntax error in SiddhiQL, mismatched input ‘boolean
  7. 喵哈哈村的魔法考试 Round #9 (Div.2) 题解
  8. [ZJOI2008]骑士
  9. Windows10 地平线4支持PS4手柄有线连接
  10. linux fifo文件,linux中的命名管道(FIFO)
  11. 计算机制图基本知识6,机械制图基础知识
  12. 002_simulink中显示模块中的名字
  13. SaltStack简介和安装
  14. 计算机word保存如何操作,如何保存WORD文档内容???急
  15. 【C++】struct结构体/构造函数
  16. 以太坊质押时代到来,开发者机遇何在?
  17. AI医学诊断基础-CT扫描、核磁共振成像(MRI)、拍X光、拍胸片、做B超/彩超等常规检查的介绍、原理、医学影像示例(持续跟新和答疑。。。)
  18. java中的开方Math.sqrt(n)函数和平方{a的b次方Math.pow(a, b)}
  19. GDOI2017 总结
  20. 【微信小程序开发】IOS与安卓样式兼容问题

热门文章

  1. python读取pdf文档书签 bookmark_Python利用PyPDF2库获取PDF文件总页码实例
  2. 和gdi绘图效率比较_堪称效率神器!5款日常插件分享,错过哪一个都无比遗憾...
  3. 寻找唯一特等奖java,大工斩获唯一特等奖!这次,请为我工老师疯狂打call!
  4. powershell 学习地址
  5. 22考生这些院校计算机专业改考408
  6. 位示图 c语言程序,位示图模拟文件系统空闲快管理c语言
  7. 解决IE10以下对象不支持“bind“属性或方法
  8. C/C++中char *与wchar_t*的几种转换方法
  9. Linux的system和popen的差异
  10. Fragment之三:根据屏幕尺寸加载不同的Fragment