ReentrantLock与synchronized
1、ReentrantLock 拥有Synchronized相同的并发性和内存语义,此外还多了 锁投票,定时锁等候和中断锁等候线程A和B都要获取对象O的锁定,假设A获取了对象O锁,B将等待A释放对O的锁定,如果使用 synchronized ,如果A不释放,B将一直等下去,不能被中断如果 使用ReentrantLock,如果A不释放,可以使B在等待了足够长的时间以后,中断等待,而干别的事情ReentrantLock获取锁定与三种方式:a) lock(), 如果获取了锁立即返回,如果别的线程持有锁,当前线程则一直处于休眠状态,直到获取锁b) tryLock(), 如果获取了锁立即返回true,如果别的线程正持有锁,立即返回false;c)tryLock(long timeout,TimeUnit unit), 如果获取了锁定立即返回true,如果别的线程正持有锁,会等待参数给定的时间,在等待的过程中,如果获取了锁定,就返回true,如果等待超时,返回false;d) lockInterruptibly:如果获取了锁定立即返回,如果没有获取锁定,当前线程处于休眠状态,直到或者锁定,或者当前线程被别的线程中断2、synchronized是在JVM层面上实现的,不但可以通过一些监控工具监控synchronized的锁定,而且在代码执行时出现异常,JVM会自动释放锁定,但是使用Lock则不行,lock是通过代码实现的,要保证锁定一定会被释放,就必须将unLock()放到finally{}中3、在资源竞争不是很激烈的情况下,Synchronized的性能要优于ReetrantLock,但是在资源竞争很激烈的情况下,Synchronized的性能会下降几十倍,但是ReetrantLock的性能能维持常态;
相同:ReentrantLock提供了synchronized类似的功能和内存语义。
不同:
1.ReentrantLock功能性方面更全面,比如时间锁等候,可中断锁等候,锁投票等,因此更有扩展性。在多个条件变量和高度竞争锁的地方,用ReentrantLock更合适,ReentrantLock还提供了Condition,对线程的等待和唤醒等操作更加灵活,一个ReentrantLock可以有多个Condition实例,所以更有扩展性。
2.ReentrantLock必须在finally中释放锁,否则后果很严重,编码角度来说使用synchronized更加简单,不容易遗漏或者出错。
3.ReentrantLock 的性能比synchronized会好点。
4.ReentrantLock提供了可轮询的锁请求,他可以尝试的去取得锁,如果取得成功则继续处理,取得不成功,可以等下次运行的时候处理,所以不容易产生死锁,而synchronized则一旦进入锁请求要么成功,要么一直阻塞,所以更容易产生死锁。
5、Lock的某些方法可以决定多长时间内尝试获取锁,如果获取不到就抛异常,这样就可以一定程度上减轻死锁的可能性。
如果锁被另一个线程占据了,synchronized只会一直等待,很容易错序死锁
6、synchronized的话,锁的范围是整个方法或synchronized块部分;而Lock因为是方法调用,可以跨方法,灵活性更大
7、便于测试,单元测试时,可以模拟Lock,确定是否获得了锁,而synchronized就没办法了
ReentrantLock与synchronized相关推荐
- ReentrantLock和synchronized两种锁定机制
ReentrantLock和synchronized两种锁定机制 应用synchronized同步锁 把代码块声明为 synchronized,使得该代码具有 原子性(atomicity)和 可见性( ...
- Java中的ReentrantLock和synchronized两种锁定机制的对比
原文:http://www.ibm.com/developerworks/cn/java/j-jtp10264/index.html 多线程和并发性并不是什么新内容,但是 Java 语言设计中的创新之 ...
- Java多线程中使用ReentrantLock、synchronized加锁 简单举例
Java多线程中使用ReentrantLock.synchronized加锁 简单举例 public class Demo {final static Lock lock = new Reentran ...
- ReentrantLock和synchronized锁
ReentrantLock和synchronized锁 这两个锁都是独占锁,所谓独占,就是我在用,你不准用,当锁定时,其他线程必须等待运行的线程结束才能分得资源. 那么,两个独占锁又有什么不同呢,简单 ...
- 面试官:你说说ReentrantLock和Synchronized区别!
大家好!又和大家见面了.为了避免面试尴尬,今天同比较通俗语言和大家聊下ReentrantLock和Synchronized区别!另外:整理了一份Java面试宝典完整版PDF,已成文档 使用方式 Syn ...
- 面试官:你说说ReentrantLock和Synchronized区别
目录 使用方式 实现方式 公平和非公平 可重入锁 可中断的 条件队列 总结 大家好!又和大家见面了.为了避免面试尴尬,今天同比较通俗语言和大家聊下ReentrantLock和Synchronized区 ...
- Java 并发编程中使用 ReentrantLock 替代 synchronized 关键字原语
标签: Java 5 引入的 Concurrent 并发库软件包中,提供了 ReentrantLock 可重入同步锁,用来替代 synchronized 关键字原语,并可提供更好的性能,以及更强大的功 ...
- java公平索非公平锁_Java 并发编程中使用 ReentrantLock 替代 synchronized
Java 5 引入的 Concurrent 并发库软件包中,提供了 ReentrantLock 可重入同步锁,用来替代 synchronized 关键字原语,并可提供更好的性能,以及更强大的功能.使用 ...
- reentrantLock 和 synchronized 哪个性能高?
点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:一个线程池 bug 引发的 GC 思考!个人原创+1博客:点击前往,查看更多 链接:https://segmen ...
最新文章
- linux下将硬件时钟调整为与本地时钟一致
- 【预告】这两天可能要装Server 2012 Essentials和Nginx反向代理
- BZOJ1257 [CQOI2007]余数之和
- 做支付遇到的HttpClient大坑(一)
- 启动服务错误5拒绝访问_【Go API 开发实战 5】基础1:启动一个最简单的 RESTful API 服务器...
- 奖品好low !! -- 说说开源中国oschina的年度评选
- (15)VHDL测试激励编写(复位)
- (19)Zynq FPGA TTC定时器介绍
- 05-03 docker 常用命令
- 爬虫学习笔记(1)---简单的爬取百度贴吧
- 拉结尔6月21日服务器维护,《拉结尔》6月11日更新公告
- linux win10五笔码表,wubiLex(Win10微软五笔码表安装管理助手)V9.6.0.1 正式版
- 为什么你玩lol遇到的队友都是坑(适用于所有moba游戏)
- echarts柱状图及阴影偏移
- 思科模拟器Cisco Packet Tracer的中文安装 [含安装包]
- 计算机专业简历教育背景怎么写,简历中的教育背景应该怎么写
- 粒子滤波 particle filter—从贝叶斯滤波到粒子滤波—Part-V(粒子滤波 PF)
- ESP8266-Arduino编程实例-MLX90393磁场传感器驱动
- Python 3.6 中使用pdfminer解析pdf文件
- 毕业论文字体字号格式要求