前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >synchronized和lock区别

synchronized和lock区别

作者头像
鳄鱼儿
发布2024-05-21 17:11:43
960
发布2024-05-21 17:11:43
举报
文章被收录于专栏:鳄鱼儿的技术分享

synchronized和lock区别

  1. Lock是一个接口,而synchronized是Java中的关键字,synchronized是内置的语言实现; ​
  2. synchronized在发生异常时,会自动释放线程占有的锁,因此不会导致死锁现象发生;
    • 而Lock在发生异常时,如果没有主动通过unLock()去释放锁,则很可能造成死锁现象,因此使用Lock时需要在finally块中释放锁;
  3. Lock可以让等待锁的线程响应中断,而synchronized却不行,使用synchronized时,等待的线程会一直等待下去,不能够响应中断;
  4. 通过Lock可以知道有没有成功获取锁,而synchronized却无法办到。
  5. Lock可以提高多个线程进行读操作的效率。
    • 在性能上来说,如果竞争资源不激烈,两者的性能是差不多的,而当竞争资源非常激烈时(即有大量线程同时竞争),此时Lock的性能要远远优于synchronized。所以说,在具体使用时要根据适当情况选择。

实现方式:

  1. synchronized属于独占式悲观锁,是通过JVM隐式实现的,synchronized只允许同一时刻只有一个线程操作资源。
    • 在java中每个对象都隐式包含了一个monitor(监视器) 对象,加锁的过程其实就是竞争monitor的过程
    • 当线程进入字节码monitorenter指令后,线程将持有monitor对象,执行monitorexit时释放monitor对象
    • 当其他线程没有拿到monitor对象时,则需要阻塞等待获取该对象。
  2. ReentrantLock是Lock的默认实现方式之一,它是基于AQS(Abstract Queued Synchronizer,抽象队列同步器) 实现的,它默认是通过非公平锁实现的
    • 在它的内部都有一个state的状态字段用于表示锁被占用的
    • 如果是0则表示锁未被占用,此时线程就可以把state改为1,并成功获取
    • 而其他未获得锁的线程只能去排队等待获取锁资源。
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-05-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • synchronized和lock区别
    • 实现方式:
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档