• Java面试-Lock与Synchronized关键字的区别


    • 实现:synchronized 关键字基于 JVM 层面实现JVM 控制锁的获取和释放Lock 接口基于 JDK 层面,手动进行锁的获取和释放
    • 使用:synchronized 关键字不用手动释放锁,Lock 接口需要手动释放锁,在 finally 模块中调用 unlock 方法;
    • 锁获取超时机制:synchronized 关键字不支持,Lock 接口支持;
    • 获取锁中断机制:synchronized 关键字不支持,Lock 接口支持;
    • 释放锁的条件:synchronized 关键字在满足占有锁的线程执行完毕,或占有锁的线程异常退出,或占有锁的线程进入 waiting 状态才会释放锁。Lock 接口调用 unlock 方法释放锁;
    • 公平性:synchronized 关键字为非公平锁。Lock 接口可以通过入参自行设置锁的公平性。

    Lock和synchronized之间的对比

    我们通过两个个案例分析来了解 Lock 接口的优势所在。
    案例 1 :在使用 synchronized 关键字的情形下,假如占有锁的线程由于要等待 IO 或者其他原因(比如调用 sleep 方法)被阻塞了,但是又没有释放锁,那么其他线程就只能一直等待,别无他法。这会极大影响程序执行效率。

    案例 1 分析:该案例体现了 synchronized 的缺陷,当线程被占有时,其他线程会陷入无条件的长期等待。这是非常可怕的,因为系统资源有限,最终可能导致系统崩溃。

    案例 1 解决:Lock 接口中的 tryLock (long time, TimeUnit unit) 方法或者响应中断 lockInterruptibly () 方法,能够解决这种长期等待的情况。

    案例 2 :我们知道,当多个线程读写文件时,读操作和写操作会发生冲突现象,写操作和写操作也会发生冲突现象,但是读操作和读操作不会发生冲突现象。
    但是如果采用 synchronized 关键字实现同步的话,就会导致一个问题,即当多个线程都只是进行读操作时,也只有一个线程可以进行读操作,其他线程只能等待锁的释放而无法进行读操作。

    案例 2 分析:该案例体现了 synchronized 的缺陷,悲观锁的缺陷。我们说过,如果只是读操作,没有增删改操作的话,多线程环境下无需加锁。但是这种情况下,如果在同一时间多个线程进行读操作,synchronized 会 block 其他的读操作,这是不合理的。

    案例 2 解决:Lock 接口家族也可以解决这种情况,后续我们会对 ReadWriteLock 接口的一个子类 ReentrantReadWriteLock 进行讲解。

    总结:Lock 接口实现提供了比使用 synchronized 方法和语句可获得的更广泛的锁定操作,能够解决 synchronized 不能够避免的问题。

  • 相关阅读:
    【译】使用 .NET Aspire 和 Visual Studio 开发云原生应用
    【实用干货】如何用LightningChart创建WPF 2D热图?(一)
    对接亚马逊aws通过echo音箱监视摄像头
    RecycleView滑动、缓存、复用源码分析与优化
    test1
    vue基础难点总结
    基于公用通信网络的区域级 C-V2X应用系统技术要求 应用系统技术要求
    clickhouse单节点以及集群的安装
    Linux环境下安装人大金仓数据库
    缓存一致性,删除缓存,写入缓存,缓存击穿,缓存穿透,缓存雪崩
  • 原文地址:https://blog.csdn.net/abc123mma/article/details/128064460