阿里面试实战题2----ReentrantLock里面lock和tryLock的区别

ReentrantLock

ReentrantLock(轻量级锁)也可以叫对象锁,可重入锁,互斥锁。synchronized重量级锁,JDK前期的版本lock比synchronized更快,在JDK1.5之后synchronized引入了偏向锁,轻量级锁和重量级锁。以致两种锁性能旗鼓相当,看个人喜欢,本文主要介绍一下lock和tryLock的区别。

Lock VS  TryLock

 1 public void lock() {
 2     sync.lock();
 3 }
 4
 5 public void lockInterruptibly() throws InterruptedException {
 6   sync.acquireInterruptibly(1);
 7 }
 8
 9
10
11 public boolean tryLock() {
12     return sync.nonfairTryAcquire(1);
13 }
14
15
16 public boolean tryLock(long timeout, TimeUnit unit)
17         throws InterruptedException {
18     return sync.tryAcquireNanos(1, unit.toNanos(timeout));
19 }

举一个例子如下:

假如线程A和线程B使用同一个锁LOCK,此时线程A首先获取到锁LOCK.lock(),并且始终持有不释放。如果此时B要去获取锁,有四种方式:

  • LOCK.lock(): 此方式会始终处于等待中,即使调用B.interrupt()也不能中断,除非线程A调用LOCK.unlock()释放锁。
  • LOCK.lockInterruptibly(): 此方式会等待,但当调用B.interrupt()会被中断等待,并抛出InterruptedException异常,否则会与lock()一样始终处于等待中,直到线程A释放锁。
  • LOCK.tryLock(): 该处不会等待,获取不到锁并直接返回false,去执行下面的逻辑。
  • LOCK.tryLock(10, TimeUnit.SECONDS):该处会在10秒时间内处于等待中,但当调用B.interrupt()会被中断等待,并抛出InterruptedException。10秒时间内如果线程A释放锁,会获取到锁并返回true,否则10秒过后会获取不到锁并返回false,去执行下面的逻辑。

Lock和TryLock的区别

1:  lock拿不到锁会一直等待。tryLock是去尝试,拿不到就返回false,拿到返回true。

2:  tryLock是可以被打断的,被中断 的,lock是不可以。

参考资料如下:https://www.zhihu.com/question/36771163/answer/68974735

原文地址:https://www.cnblogs.com/wenbochang/p/11317571.html

时间: 2024-10-01 07:57:21

阿里面试实战题2----ReentrantLock里面lock和tryLock的区别的相关文章

阿里面试实战题1----TreeSet,HashSet 区别

TreeSet,HashSet 区别 TreeSet 1 public class TreeSet<E> extends AbstractSet<E> 2 implements NavigableSet<E>, Cloneable, java.io.Serializable 3 { 4 public TreeSet() { 5 this(new TreeMap<E,Object>()); 6 } 7 } 可以从代码中明显看出.TreeSet的底层其实是Tre

java并发-ReentrantLock的lock和lockInterruptibly的区别

ReentrantLock的加锁方法Lock()提供了无条件地轮询获取锁的方式,lockInterruptibly()提供了可中断的锁获取方式.这两个方法的区别在哪里呢?通过分析源码可以知道lock方法默认处理了中断请求,一旦监测到中断状态,则中断当前线程:而lockInterruptibly()则直接抛出中断异常,由上层调用者区去处理中断. 1  lock操作 lock获取锁过程中,忽略了中断,在成功获取锁之后,再根据中断标识处理中断,即selfInterrupt中断自己. acquire操作

阿里P7Java最全面试296题:阿里天猫、蚂蚁金服含答案文档解析

[阿里天猫.蚂蚁.钉钉面试专题题目加答案] 不会做别着急:文末有答案以及视频讲解,架构师资料 1. junit用法,before,beforeClass,after, afterClass的执行顺序 2. 分布式锁 3. nginx的请求转发算法,如何配置根据权重转发 4. 用hashmap实现redis有什么问题(死锁,死循环,可用ConcurrentHashmap) 5. 线程的状态 5. 线程的阻塞的方式 6. sleep和wait的区别 7. hashmap的底层实现 8. 一万个人抢1

阿里最全面试100题:阿里天猫、蚂蚁金服、阿里巴巴面试题含答案

[阿里天猫.蚂蚁.钉钉面试题目] 1.微信红包怎么实现. 2.海量数据分析. 3.测试职位问的线程安全和非线程安全. 4.HTTP2.0.thrift. 5.面试电话沟通可能先让自我介绍. 6.分布式事务一致性. 7.nio的底层实现. 8.jvm基础是必问的,jvm GC原理,JVM怎么回收内存. 9.Java是什么. 10.API接口与SDI接口的区别(API是提供给别人的接口). 11.dubbo如何一条链接并发多个调用.Dubbo的原理,序列化相关问题. 12.用过哪些中间件. 13.做

阿里面试回来,想和Java程序员谈一谈(转载)

引言 其实本来真的没打算写这篇文章,主要是LZ得记忆力不是很好,不像一些记忆力强的人,面试完以后,几乎能把自己和面试官的对话都给记下来.LZ自己当初面试完以后,除了记住一些聊过的知识点以外,具体的内容基本上忘得一干二净,所以写这篇文章其实是很有难度的. 但是,最近问LZ的人实在是太多了,为了避免重复回答,给自己省点力气,干脆就在这里统一回复了. 其实之前LZ写过一篇文章,但是那篇文章更多的是在讨论“面试前该不该刷题”这个话题,而这篇文章将会更加聚焦在面试前如何准备,以及工作当中如何学习这个话题上

阿里面试回来,想和Java程序员谈一谈

引言 其实本来真的没打算写这篇文章,主要是LZ得记忆力不是很好,不像一些记忆力强的人,面试完以后,几乎能把自己和面试官的对话都给记下来.LZ自己当初面试完以后,除了记住一些聊过的知识点以外,具体的内容基本上忘得一干二净,所以写这篇文章其实是很有难度的. 但是,最近问LZ的人实在是太多了,为了避免重复回答,给自己省点力气,干脆就在这里统一回复了. 其实之前LZ写过一篇文章,但是那篇文章更多的是在讨论“面试前该不该刷题”这个话题,而这篇文章将会更加聚焦在面试前如何准备,以及工作当中如何学习这个话题上

阿里面试 Java 都问什么?万字总结!

作者:rhwayfunn blog.csdn.net/u011116672/article/details/50991618 拿到阿里实习offer,经历了5次面试,其中4轮技术面,1轮HR面试.在这里分享一下自己的面试经验和学习总结.希望能够帮助更多的小伙伴. 我本科毕业于中南大学信管专业,真正开始学习Java是在大三下学期,研究生就读北航的移动云计算专业. 刚开始也是小白,也是一步步成成起来的.需要提的一点是,你将来是需要靠这个吃饭的,所以请对找工作保持十二分的热情,而且越早准备越好. 阿里

18道Shell高级编程企业实战题及参考答案(一)

Shell高级编程企业实战题参考解答 ########################################################################### 让我们一起感谢,本文内容答案完全来自老男孩教育的学生-张耀课前上机考试解答! ########################################################################### 目录: 1.监控MySQL主从同步... 1 2.批量创建文件及改名... 3

shell高级编程企业实战题编程---是骡子是马 牵出来溜溜!

企业合格的linux运维必会编程题,能独立完成的同学就业工资不会低于10K 这是老男孩linux运维班要求学生必会的题目,完不成的不能合格毕业,每个完成的都奖励价值500-1000元的等值礼物(以当天考试成绩宣布为准),要进要退自己抉择,伙伴们走起! 实战考试时间就在2015年4月15日上机实战,禁止大面积抄袭学习课堂笔记否则无奖励!共18道考试题,面授上课几乎全部讲解过类似的案例,考试题略微变更而已. 企业面试题1:(生产实战案例):监控MySQL主从同步是否异常,如果异常,则发送短信或者邮件