【Java锁体系】五、隐式锁和显式锁的区别(Synchronized和Lock的区别)
发布日期:2021-06-29 15:35:13 浏览次数:3 分类:技术文章

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

目录:

【Java锁体系】五、隐式锁和显式锁的区别(Synchronized和Lock的区别)

在Java并发编程中,Java中隐式锁有synchronized,显式锁有Lock。

1.两者的出身不同

synchronized是Java中的关键字,由JVM维护,是JVM层面的锁;

而lock是JDK5之后才出现的具体的类,使用Lock是调用对应的API,是API层面的锁。

synchronized的底层是通过monitorenter进行加锁的(底层是通过monitor对象来完成的,其中的wait/notify等方法也是依赖monito对象的,只有在同步块或者是同步方法中才可以调用wait/notify方法。因为只有在同步块或同步方法中,JVM才会调用monitor对象的。);通过monitorexit来退出锁的。

Lock则是通过调用相应的API方法来获取和释放锁

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GSkVVUQw-1608212002139)(D:\software\typora\workplace\imgs_cas\27.jpg)]

2.使用方式的不同

synchronized隐式锁;lock是显式锁

显氏锁和隐式锁的区别在于:使用显式锁的时候,使用者需要手动去获取和释放锁。

在使用synchronized关键字的时候,使用者不需要写其他的代码,程序就可以自动获取锁和释放锁。synchronized是由系统维护的,系统会自动的让程序释放占用的锁。

在使用lock的时候,需要使用者手动去获取锁和释放锁。如果没有释放锁,就可能出现死锁的现象。手动获取锁的方法lock.lock(); 释放锁的操作:unlock().

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EhpupxQg-1608212002141)(D:\software\typora\workplace\imgs_cas\28.png)]

3.等待是否中断

synchronized关键字是不可中断的,除非抛出异常或者正常运行结束

而Lock是可以中断的,中断方式:

  • 调用设置超时方法tryLock(Long timeout,timeUnit unit)
  • 调用lockInterruptibly()放到代码块中,然后调用interrupt()方法可以中断。

4.加锁的时候是否公平

synchronized是非公平锁;

而lock两者都可以,默认创建是非公平锁。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dK4j6BIw-1608212002143)(D:\software\typora\workplace\imgs_cas\29.png)]

5.锁绑定多个条件来condition

synchronized要么随机唤醒一个线程;要么是唤醒所有等待的线程。

lock:可以用实现分组唤醒需要唤醒的线程,可以精准的唤醒,而不是像synchronized那样,不能精准唤醒线程。

6.性能比较

synchronized是托管给JVM去执行的,而Lock是Java写的控制锁的代码。在Java1.5中,synchronized的性能是低效的,因为其是重量级锁的操作,需要从用户态切换到内核态消耗大量的时间。相比之下使用Java提供的Lock对象,性能更高一些。但是到了Java1.6之后,对synchronized关键字进行了优化,有适应性自旋,锁消除,轻量级锁,偏向锁等,导致在Java1.6中synchronized的性能并不比lock差。

在之前的synchronized版本中使用是悲观锁的机制,即线程独占锁,其它线程只能依靠阻塞来等待线程释放的锁,而线程阻塞时会引起线程的上下文切换,当有很多线程竞争锁的时候,会引起CPU频繁的上下文切换导致效率很低。

而Lock使用的乐观锁的方式。所谓乐观锁就是,每次不加锁而是假设没有冲突而去完成某项操作,如果因为冲突失败就重试,直到成功为止。乐观锁的实现方式就CAS机制(compareAndSetstate),调用的是CPU提供的底层指令。

转载地址:https://codingchaozhang.blog.csdn.net/article/details/111338689 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:【Java锁体系】六、AQS原理分析(AbstractQueuedSynchronizer实现分析)
下一篇:【Leetcode刷题篇/面试篇】经典动态规划-买卖股票问题总结汇总

发表评论

最新留言

路过,博主的博客真漂亮。。
[***.116.15.85]2024年04月14日 16时05分52秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

谷歌大脑新作:教你训练自己的视觉Transfomer模型 2019-04-29
即插即用!浙大&港中文提出CompConv卷积:让模型不丢精度还可以提速 2019-04-29
燕山大学教授称已推翻爱因斯坦的相对论!论文入选河北省科技奖推荐项目!各方最新回应... 2019-04-29
想快速发表CV、NLP论文?试试这几个方向! 2019-04-29
南开&阿里提出P2T:基于金字塔池化的视觉Transformer!可用于各类下游场景理解任务!... 2019-04-29
博士论文致谢走红后,黄国平母校演讲再刷屏! 2019-04-29
当YOLOv5遇见OpenVINO! 2019-04-29
北京大学施柏鑫:从审稿人视角,谈谈怎么写一篇CVPR论文 2019-04-29
CVPR 2021 | 谷歌提出MobileDets:轻量化目标检测网络 2019-04-29
打破Transformer宿命!新秀VOLO开源!横扫CV多项记录,首个超越87%的模型 2019-04-29
浙大提出U-Net 3+:全尺度的跳跃连接的UNet 2019-04-29
厚积薄发!他读博前三年零文章,后期发力产出11篇一作,现任985高校博导 2019-04-29
那些在家啃书自学算法的人,最后都找到工作了吗? 2019-04-29
AI独角兽思谋科技-秋招/社招内推 2019-04-29
上交&IIAI提出CGPS:首个弱监督/无监督的行人搜索框架 2019-04-29
无需卷积和注意力!颜水成、程明明团队开源ViP:用于视觉识别的可置换MLP类架构... 2019-04-29
华中科技大学通报:取消张某某研究生导师资格,调离教师岗位,停止其教师资格... 2019-04-29
京东招聘数字人方向算法实习生 2019-04-29
PVTv2来了!金字塔视觉Transformer重磅升级!三点改进,性能大幅提升 2019-04-29
一文看尽深度学习中的各种注意力机制(1998-2020年) 2019-04-29