在reentrantLock中,提供了一个lock和一个tryLock方法,这两个方法是有区别的,这篇笔记主要记录下具体的区别信息

结论

其实对于这个两个方法,简单来说,tryLock()方法,返回的是一个boolean类型变量,返回true,表示加锁成功,返回false,表示加锁失败,但是这个方法是没有排队的功能的
lock()方法有两个功能:尝试加锁 + 排队;所以,lock方法如果加锁失败,会去排队,我们也可以简单的认为,lock = tryLock + 排队方法

lock()源码

lock在加锁的时候,我们看下源码,以非公平锁为例

/*** 非公平锁在加锁的时候,会先尝试加锁,如果加锁失败,就调用acquire();* 在acquire()方法中,公平锁和非公平锁的区别是:在state为1的时候,非公平锁不会判断当前是否允许加锁,而是直接cas加锁,如果加锁失败,就去排队,后面的流程,就和公平锁一样了*/
final void lock() {if (compareAndSetState(0, 1))setExclusiveOwnerThread(Thread.currentThread());elseacquire(1);
}public final void acquire(int arg) {if (!tryAcquire(arg) &&acquireQueued(addWaiter(Node.EXCLUSIVE), arg))selfInterrupt();
}protected final boolean tryAcquire(int acquires) {return nonfairTryAcquire(acquires);
}

这里可以看到,有两个方法,一个是tryAcquire方法,一个是acquireQueued方法,这两个方法,分别是尝试加锁方法,和排队方法

tryLock()源码

// 这是尝试加锁的逻辑
public boolean tryLock() {return sync.nonfairTryAcquire(1);
}/*** 非公平锁在加锁的时候,不会判断是否允许排队,而是直接尝试cas加锁,成功就成功,不成功就排队* 在直接加锁的前提是,当前的state是0* @param acquires* @return*/
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) // overflowthrow new Error("Maximum lock count exceeded");setState(nextc);return true;}return false;
}

可以看到,在尝试加锁的时候,就只调用了一个tryAcquire的方法,所以,对于tryLock()方法来说,就是一个尝试加锁的逻辑,如果加锁成功,就返回true,加锁失败,就返回false,所以,这个方法是lock方法的一部分

ReentrantLock源码lock和tryLock区别相关推荐

  1. synchronized 和 reentrantlock 区别是什么_JUC源码系列之ReentrantLock源码解析

    目录 ReentrantLock 简介 ReentrantLock 使用示例 ReentrantLock 与 synchronized 的区别 ReentrantLock 实现原理 Reentrant ...

  2. ReentrantLock源码分析(一)

    1.ReentrantLock简介 理解了AQS,ReentrantLock理解起来其实就没有什么难度了.ReentrantLock,可重入锁.它可以等同于 synchronized的使用,但是Ree ...

  3. JUC AQS ReentrantLock源码分析

    Java的内置锁一直都是备受争议的,在JDK 1.6之前,synchronized这个重量级锁其性能一直都是较为低下,虽然在1.6后,进行大量的锁优化策略,但是与Lock相比synchronized还 ...

  4. 多线程(三)之ReentrantLock源码解析

    2019独角兽企业重金招聘Python工程师标准>>> 今天分析ReentrantLock类的源码,在看源码之前,先学习AQS(AbstractQueuedSynchronizer) ...

  5. Java并发编程-ReentrantLock源码分析

    一.前言 在分析了 AbstractQueuedSynchronier 源码后,接着分析ReentrantLock源码,其实在 AbstractQueuedSynchronizer 的分析中,已经提到 ...

  6. 面试官系统精讲Java源码及大厂真题 - 32 ReentrantLock 源码解析

    32 ReentrantLock 源码解析 才能一旦让懒惰支配,它就一无可为. 引导语 上两小节我们学习了 AQS,本章我们就要来学习一下第一个 AQS 的实现类:ReentrantLock,看看其底 ...

  7. 【java】java ReentrantLock 源码详解

    文章目录 1.概述 2.问题 3.ReentrantLock源码分析 3.1 类的继承关系 3.2 类的内部类 3.2.1 Sync类 3.2.2 NonfairSync类 3.2.3 FairSyn ...

  8. 闲聊AQS面试和源码解读---可重入锁、LockSupport、CAS;从ReentrantLock源码来看公平锁与非公平锁、AQS到底是怎么用CLH队列来排队的?

    AQS原理可谓是JUC面试中的重灾区之一,今天我们就来一起看看AQS到底是什么? 这里我先整理了一些JUC面试最常问的问题? 1.Synchronized 相关问题以及可重入锁 ReentrantLo ...

  9. Java8 ReentrantLock 源码分析

    一.ReentrantLock 概述 1.1 ReentrantLock 简介 故名思义,ReentrantLock 意为可重入锁,那么什么是可重入锁呢?可重入意为一个持有锁的线程可以对资源重复加锁而 ...

  10. ReentrantLock源码分析

    ReentrantLock源码分析 前言 最近公司比较忙,整天忙着做项目.做需求,感觉整个人昏昏沉沉的,抬头看天空感觉都是灰色的~~,其实是杭州的天本来就是这个颜色,手动滑稽`~(^o^)/~`.废话 ...

最新文章

  1. 流水账之都市:我是一个客居者
  2. HBase的Shell操作
  3. Android——TabLayout 默认某个选项卡选中
  4. Spring boot的properties文件编码设置
  5. jpa hibernate mysql_008Spring JPA Hibernate MySQL
  6. 我理解Docker的过程2
  7. Eclipse中导入Java项目出现“No projects are found to import”
  8. es6 嵌套数组循环_ES6 常用数组循环
  9. php mail执行命令,PHPMailer 命令执行 任意文件读取漏洞利用 【含POC】
  10. Shell脚本中调用另外一个脚本的方法
  11. Navicat for MySQL 64位破解版
  12. 给txt格式的文档增加目录
  13. 修改PPT文档属性工具使用教程
  14. Linux scp命令复制文件报错: not a regular file
  15. 联想电脑重装系统F12开机项选择无USB启动选项
  16. ViewData与ViewBag的区别与联系
  17. vue---lodash的使用
  18. Image2Lcd图片取模软件
  19. 周易六十四卦——雷火丰卦
  20. linux内核中的文件描述符(四)--fd的分配--get_unused_fd

热门文章

  1. C/C++[codeup 2064]编排字符串
  2. 极客大学架构师训练营 性能优化 进程 线程 锁 存储 分布式数据库 第14课 听课总结
  3. The Basic Knowledge of Graph(图的基本知识)
  4. 532. 数组中的K-diff数对
  5. 438.找到字符串中所有字母异位词
  6. matlab仿真之大尺度衰落因子的产生
  7. leetcode485、448、414
  8. 深度学习笔记(一):logistic分类
  9. 概率图模型(PGM)学习笔记(四)-贝叶斯网络-伯努利贝叶斯-多项式贝叶斯
  10. 二叉树遍历(递归与非递归版本)