鳄鱼儿
synchronized和lock区别
关注作者
前往小程序,Get
更优
阅读体验!
立即前往
腾讯云
开发者社区
文档
建议反馈
控制台
登录/注册
首页
学习
活动
专区
工具
TVP
最新优惠活动
文章/答案/技术大牛
搜索
搜索
关闭
发布
首页
学习
活动
专区
工具
TVP
最新优惠活动
返回腾讯云官网
鳄鱼儿
首页
学习
活动
专区
工具
TVP
最新优惠活动
返回腾讯云官网
社区首页
>
专栏
>
synchronized和lock区别
synchronized和lock区别
鳄鱼儿
关注
发布于 2024-05-21 17:11:43
96
0
发布于 2024-05-21 17:11:43
举报
文章被收录于专栏:
鳄鱼儿的技术分享
synchronized和lock区别
Lock是一个接口,而synchronized是Java中的关键字,synchronized是内置的语言实现;
synchronized在发生异常时,会
自动释放线程占有的锁
,因此不会导致死锁现象发生;
而Lock在发生异常时,如果没有主动通过unLock()去释放锁,则很可能造成死锁现象,因此使用Lock时需要在finally块中释放锁;
Lock可以让
等待锁的线程响应中断
,而synchronized却不行,使用synchronized时,等待的线程会一直等待下去,不能够响应中断;
通过Lock可以知道有没有成功获取锁,而synchronized却无法办到。
Lock可以提高多个线程进行读操作的效率。
在性能上来说,如果竞争资源不激烈,两者的性能是差不多的,而当竞争资源非常激烈时(即有大量线程同时竞争),此时Lock的性能要远远优于synchronized。所以说,在具体使用时要根据适当情况选择。
实现方式:
synchronized属于独占式悲观锁,是通过JVM隐式实现的,synchronized只允许同一时刻只有一个线程操作资源。
在java中每个对象都隐式包含了一个monitor(监视器) 对象,加锁的过程其实就是竞争monitor的过程
当线程进入字节码monitorenter指令后,线程将持有monitor对象,执行monitorexit时释放monitor对象
当其他线程没有拿到monitor对象时,则需要阻塞等待获取该对象。
ReentrantLock是Lock的默认实现方式之一,它是基于
AQS(Abstract Queued Synchronizer,抽象队列同步器)
实现的,它默认是通过非公平锁实现的
在它的内部都有一个state的状态字段用于表示锁被占用的
如果是0则表示锁未被占用,此时线程就可以把state改为1,并成功获取
而其他未获得锁的线程只能去排队等待获取锁资源。
本文参与
腾讯云自媒体同步曝光计划
,分享自作者个人站点/博客。
原始发表:2024-05-21,如有侵权请联系
cloudcommunity@tencent.com
删除
前往查看
lock
synchronized
对象
线程
性能
本文分享自
作者个人站点/博客
前往查看
如有侵权,请联系
cloudcommunity@tencent.com
删除。
本文参与
腾讯云自媒体同步曝光计划
,欢迎热爱写作的你一起参与!
lock
synchronized
对象
线程
性能
评论
登录
后参与评论
0 条评论
热度
最新
推荐阅读
LV.
文章
0
获赞
0
目录
synchronized和lock区别
实现方式:
领券
问题归档
专栏文章
快讯文章归档
关键词归档
开发者手册归档
开发者手册 Section 归档
0
0
0
推荐