Java中的锁 | Sychronized & Lock 的区别
发布日期:2022-02-21 17:40:22 浏览次数:69 分类:技术文章

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

Java中的锁 | Sychronized & Lock 的区别


1. 相同点

  1. 用来做代码块的同步控制
  2. 都是可重入锁

2. 不同点

  1. 来源不同
    • Synchronized是Java提供的关键字,属于Java语法层面的互斥锁,也称“隐式锁”。竞争锁、释放锁的过程开发者无需关心也不能干预,由JVM来完成。
    • Lock是指java.util.concurrent包下的Lock接口,描述的是一把同步锁,由Java代码来控制多线程同步,也称“显式锁”。可以自己实现一把锁,也可以直接使用由并发大神Doug Lea编写的ReentrantLock
  2. 锁的释放不同
    • Synchronized锁的释放由JVM来完成,开发者无法干预。同步代码块运行结束,或者出现异常JVM均会释放锁。
    • Lock加的锁必须开发者手动释放,如果同步代码块抛了异常,锁没释放则会发生死锁,一般释放锁代码建议写在 finally 块中,确保锁一定释放。
  3. 性能不同
    • Synchronized在JDK6之前,采用OS级别的互斥锁,竞争锁失败的线程会被挂起,性能非常低,JDK6做了大量优化,会自动进行锁膨胀,降低了锁开销,性能提升很大,但是竞争激烈时性能还是会下降。
    • Lock不管锁竞争激烈与否,性能基本保持在一个数量级,适合锁竞争比较激烈的应用场景
  4. 竞争锁失败的线程状态不同
    • Synchronized竞争锁失败的线程状态是:BLOCKED
    • Lock竞争锁失败的线程状态是:WAITING
  5. JVM堆栈跟踪
    • Synchronized阻塞的线程更加便于JVM跟踪,使用 jstack 可以清楚的看到。
    • Lock通过LockSupport.park() 来阻塞线程,不利于JVM跟踪。
  6. 响应中断
    • Synchronized不支持响应中断,竞争不到锁会一直阻塞。
    • Lock支持响应中断。
  7. 锁超时
    • Synchronized不支持锁超时,竞争不到锁会一直死等,容易造成死锁。
    • Lock支持锁超时,在给定时间内获取不到锁可以进行其他处理。
  8. 公平/非公平锁
    • Synchronized采用非公平锁,且不允许修改,可能会造成“线程饿死”。
    • Lock支持公平锁与非公平锁,开发者可以自己选择。
  9. 尝试获取锁判断
    • Synchronized不支持获取锁成功与否的判断。
    • Lock支持。
  10. 读写锁
    • Synchronized不支持读写锁,对于读多写少的场景无法优化性能
    • Lock支持读写锁,读读不互斥,对于读多写少的场景可以进一步优化性能。

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

上一篇:数据结构 | java中的集合
下一篇:Java中的锁 | 锁的种类

发表评论

最新留言

第一次来,支持一个
[***.219.124.196]2024年04月08日 15时03分28秒

关于作者

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

推荐文章

Android Studio ADB WIFI无线调试APP正确用法 2019-04-26
服务器数据迁移:为知笔记私服数据迁移 2019-04-26
CentOS7+安装Docker,并部署为知笔记服务端Docker镜像 2019-04-26
iterm2使用:服务器ssh快捷连接 2019-04-26
MacOS/BigSur安卓设备投屏控制Scrcpy命令大全&快捷键 2019-04-26
MacOS/BigSur安卓设备投屏控制Scrcpy安装,Mac上的Total Control 2019-04-26
CentOS7+安装Java JDK1.8 2019-04-26
CentOS7+运行/停止Java后台程序,&问题处理 2019-04-26
CentOS7+手动文件方式安装Mysql8.0.22详解(图文) 2019-04-26
【5年Android从零复盘系列之一】关于Android的一些基础知识详解 2019-04-26
【5年Android从零复盘系列之二】Android中使用xml代码绘制Drawable资源图 详解 2019-04-26
【5年Android从零复盘系列之三】Android中制作.9图片资源/draw9patch详解(图文) 2019-04-26
【5年Android从零复盘系列之四】Android绘制详解(图文):善用layer-list提高绘制效率/减小APK体积 2019-04-26
【5年Android从零复盘系列之五】关于页面布局控件开发总结 2019-04-26
【5年Android从零复盘系列之六】Android自定义View(1):基础详解(图文) 2019-04-26
【5年Android从零复盘系列之七】Android自定义View(2):组合式详解(图文) 2019-04-26
【5年Android从零复盘系列之八】Android自定义View(3):衍生/扩展式 详解(图文) 2019-04-26
【5年Android从零复盘系列之九】Android自定义View(4):自绘式详解(图文) 2019-04-26
【5年Android从零复盘系列之十】Android自定义View(5):画布Canvas详解(图文) 2019-04-26
【5年Android从零复盘系列之十一】Android自定义View(6):画笔Paint 2019-04-26