深入Synchronized和java.util.concurrent.locks.Lock的区别详解
答案:2 悬赏:20
解决时间 2021-02-23 07:30
- 提问者网友:空白
- 2021-02-23 00:48
深入Synchronized和java.util.concurrent.locks.Lock的区别详解
最佳答案
- 二级知识专家网友:承载所有颓废
- 2021-02-23 02:04
synchronized的修饰符可以让代码更优雅,但是Lock类都需要调用方法锁和解锁,而且Lock的方法更多,更有用。
全部回答
- 1楼网友:甜野猫
- 2021-02-23 03:39
总的来说,lock更加灵活。
主要相同点:lock能完成synchronized所实现的所有功能
不同:
1.reentrantlock功能性方面更全面,比如时间锁等候,可中断锁等候,锁投票等,因此更有扩展性。在多个条件变量和高度竞争锁的地方,用reentrantlock更合适,reentrantlock还提供了condition,对线程的等待和唤醒等操作更加灵活,一个reentrantlock可以有多个condition实例,所以更有扩展性。
2.reentrantlock必须在finally中释放锁,否则后果很严重,编码角度来说使用synchronized更加简单,不容易遗漏或者出错。
3.reentrantlock 的性能比synchronized会好点。
4.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的性能能维持常态
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯
• 手机登qq时,显示手机磁盘不足,清理后重新登 |
• 刺客的套装怎么选啊? |