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相关推荐

  1. ReentrantLock和synchronized两种锁定机制

    ReentrantLock和synchronized两种锁定机制 应用synchronized同步锁 把代码块声明为 synchronized,使得该代码具有 原子性(atomicity)和 可见性( ...

  2. Java中的ReentrantLock和synchronized两种锁定机制的对比

    原文:http://www.ibm.com/developerworks/cn/java/j-jtp10264/index.html 多线程和并发性并不是什么新内容,但是 Java 语言设计中的创新之 ...

  3. Java多线程中使用ReentrantLock、synchronized加锁 简单举例

    Java多线程中使用ReentrantLock.synchronized加锁 简单举例 public class Demo {final static Lock lock = new Reentran ...

  4. ReentrantLock和synchronized锁

    ReentrantLock和synchronized锁 这两个锁都是独占锁,所谓独占,就是我在用,你不准用,当锁定时,其他线程必须等待运行的线程结束才能分得资源. 那么,两个独占锁又有什么不同呢,简单 ...

  5. 面试官:你说说ReentrantLock和Synchronized区别!

    大家好!又和大家见面了.为了避免面试尴尬,今天同比较通俗语言和大家聊下ReentrantLock和Synchronized区别!另外:整理了一份Java面试宝典完整版PDF,已成文档 使用方式 Syn ...

  6. 面试官:你说说ReentrantLock和Synchronized区别

    目录 使用方式 实现方式 公平和非公平 可重入锁 可中断的 条件队列 总结 大家好!又和大家见面了.为了避免面试尴尬,今天同比较通俗语言和大家聊下ReentrantLock和Synchronized区 ...

  7. Java 并发编程中使用 ReentrantLock 替代 synchronized 关键字原语

    标签: Java 5 引入的 Concurrent 并发库软件包中,提供了 ReentrantLock 可重入同步锁,用来替代 synchronized 关键字原语,并可提供更好的性能,以及更强大的功 ...

  8. java公平索非公平锁_Java 并发编程中使用 ReentrantLock 替代 synchronized

    Java 5 引入的 Concurrent 并发库软件包中,提供了 ReentrantLock 可重入同步锁,用来替代 synchronized 关键字原语,并可提供更好的性能,以及更强大的功能.使用 ...

  9. reentrantLock 和 synchronized 哪个性能高?

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:一个线程池 bug 引发的 GC 思考!个人原创+1博客:点击前往,查看更多 链接:https://segmen ...

最新文章

  1. linux下将硬件时钟调整为与本地时钟一致
  2. 【预告】这两天可能要装Server 2012 Essentials和Nginx反向代理
  3. BZOJ1257 [CQOI2007]余数之和
  4. 做支付遇到的HttpClient大坑(一)
  5. 启动服务错误5拒绝访问_【Go API 开发实战 5】基础1:启动一个最简单的 RESTful API 服务器...
  6. 奖品好low !! -- 说说开源中国oschina的年度评选
  7. (15)VHDL测试激励编写(复位)
  8. (19)Zynq FPGA TTC定时器介绍
  9. 05-03 docker 常用命令
  10. 爬虫学习笔记(1)---简单的爬取百度贴吧
  11. 拉结尔6月21日服务器维护,《拉结尔》6月11日更新公告
  12. linux win10五笔码表,wubiLex(Win10微软五笔码表安装管理助手)V9.6.0.1 正式版
  13. 为什么你玩lol遇到的队友都是坑(适用于所有moba游戏)
  14. echarts柱状图及阴影偏移
  15. 思科模拟器Cisco Packet Tracer的中文安装 [含安装包]
  16. 计算机专业简历教育背景怎么写,简历中的教育背景应该怎么写
  17. 粒子滤波 particle filter—从贝叶斯滤波到粒子滤波—Part-V(粒子滤波 PF)
  18. ESP8266-Arduino编程实例-MLX90393磁场传感器驱动
  19. Python 3.6 中使用pdfminer解析pdf文件
  20. 毕业论文字体字号格式要求

热门文章

  1. 国家智慧城市战略实施 保温材料等建材万亿市场待挖掘
  2. codevs——2894 Txx考试(背包)
  3. 刚刚、几秒前,时间格式化函数
  4. JVM 出了问题 EXCEPTION_ACCESS_VIOLATION
  5. Vsftp 安装配置(转)
  6. python 十大经典排序算法
  7. IntelliJ IDEA控制台输出中文乱码问题解决
  8. 运维39脱产班 决心书
  9. [置顶]一步步构建大型网站架构
  10. 肤色检测算法 - 基于不同颜色空间简单区域划分的皮肤检测算法