博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ReentrantLock与synchronized
阅读量:6989 次
发布时间:2019-06-27

本文共 1517 字,大约阅读时间需要 5 分钟。

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就没办法了

转载于:https://www.cnblogs.com/fengli9998/p/8879891.html

你可能感兴趣的文章
git的使用(3) 多分支情况下的pull
查看>>
【转载】C/C++杂记:运行时类型识别(RTTI)与动态类型转换原理
查看>>
Session、Cookie及cache的区别
查看>>
AS项目转到eclipse中方法
查看>>
java里有没有专门判断List里有重复的数据
查看>>
在C#中,Json的序列化和反序列化的几种方式总结
查看>>
[转] sql 删除表数据的drop、truncate和delete用法
查看>>
python基础——切片
查看>>
设计模式之适配器模式
查看>>
Oracle 字符集的查看和修改
查看>>
pwd, cd, ls, touch, mkdir, rmdir, rm
查看>>
ArcGIS Engine开发之地图基本操作(2)
查看>>
Redis性能问题排查解决手册(七)
查看>>
如何在Windows系统上用抓包软件Wireshark截获iPhone等网络通讯数据
查看>>
[LintCode] LRU Cache 缓存器
查看>>
计算机名、主机名、用户账户名与NetBIOS名有什么区别
查看>>
[Angular 2] BYPASSING PROVIDERS IN ANGULAR 2
查看>>
Django基础-过滤器
查看>>
javascript命名规范
查看>>
Git 生命周期
查看>>