synchronized和ReentrantLock区别(随笔记)

synchronized和ReentrantLock区别(随笔记)

1,区别

  1. lock是一个接口,synchronized是java中的关键字,synchronized是内置的语言实现;
  2. synchronized发生异常时,会自动释放线程占用的锁,故不会发生死锁的情况。lock发生异常需要手动unLock方法释放锁,若不释放极可能会发生死锁;
  3. lock可以让等待线程中断响应,使用synchronized只会让线程一直等待下去,不能自行中断。
  4. 通过lock可以知道有没有获取到锁,synchronized则无法得知
  5. lock可以提高多个线程进行多谢操作的效率

2,锁区别

  1. 可中断锁:
    响应中断的锁lock时可中断锁 体现在lockinterruptibly方法中,synchronized不是。若果线程A正在执行锁中代码,线程B正在等待获取该锁。时间太长,B不想等待,可以自行中断。

  2. 公平锁:
    尽量以请求锁的顺序获取锁。比如同时有多个线程在等待一个锁,当锁被释放后,等待时间最长的获取该锁,跟京牌司法拍卖一个道理。非公平锁可能会导致有些线程永远得不到锁,synchronized是非公平锁,ReentrantLock是公平锁。

  3. 读写锁:
    读写锁将对一个资源(如文件)的访问分为2个锁,一个读锁,一个写锁;读写锁使得多个线程的读操作可以并发进行,不需同步。而写操作就得需要同步,提高了效率
    ReadWriteLock就是读写锁,是一个接口,ReentrantReadWriteLock实现了这个接口。可通过readLock()获取读锁,writeLock()获取写锁

  4. 绑定多个条件:
    一个ReentrantLock可以绑定多个Condition对象,仅需多次调用new Condition()即可;而在synchronized中锁锁对象的wait()、notify()/notifyAll()可以实现一个隐含的条件,如果要和多余的条件关联,就不得不额外的增加一个锁。

3.性能比较
大量线程同时竞争,ReentrantLock要远胜于synchronized。
JDK5中,synchronized是性能低效的,因为这是一个重量级操作,对性能的最大影响是阻塞的实现,挂起线程和恢复线程的操作,都需要转入内核态中完成,给并发带来了很大压力。
JDK6中synchronized加入了自适应自旋、锁消除、锁粗化、轻量级锁、偏向锁等一系列优化,官方也支持synchronized,提倡在synchronized能实现需求的前提下,优先考虑synchronized来进行同步

原文地址:https://blog.csdn.net/qq_36299025/article/details/89555462

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值