当前位置: 首页 > news >正文

Synchronized由什么样的缺陷? Java Lock是怎么弥补这些缺陷的?

synchronized 的缺陷

Synchronized 在 Java 中是最基础的线程同步机制,尽管简单易用,但也存在一些缺陷和局限性:

  1. 性能开销

    • synchronized 内部实现的监视器锁可能导致不必要的线程上下文切换和频繁竞争,从而引起性能下降,尤其是在高并发场景下。
  2. 不灵活

    • 一旦进入synchronized方法或代码块,就无法中断和提前退出,只能等执行完成。
    • 不支持尝试加锁(try-lock),在尝试获取锁时无法设置超时。
  3. 持有锁的时间长

    • 由于 synchronized 的锁是隐式的,默认是持有锁直到方法执行结束,可能导致长时间阻塞其他线程,降低了系统的吞吐量。
  4. 死锁风险

    • 在复杂的多线程环境中,如果使用不当,仍然可能导致死锁问题,尤其是在嵌套锁定或多个线程互相等待时。
  5. 条件通知

    • synchronized 主要通过 waitnotify 方法来实现线程间协调,但这种方式可能较为繁琐和不直观。

Java Lock 的改进

Java 提供的 java.util.concurrent.locks 包中的 Lock 接口(通常使用 ReentrantLock 来实现)弥补了上述 synchronized 的缺陷,提供了更丰富和灵活的锁机制:

  1. 性能优化

    • ReentrantLock 在高竞争情况下的性能通常优于 synchronized,其实现可以使用更高效的自旋锁机制,这样在短时间内获得锁的线程不会进行上下文切换。
  2. 可中断性

    • ReentrantLock 提供了 lockInterruptibly() 方法,允许线程在等待获取锁时能够响应中断,从而增加了线程的灵活性。
    lock.lockInterruptibly();
    
  3. 超时尝试锁定

    • 通过 tryLock() 方法,线程可以尝试获取锁,如果锁被占用,可以选择继续等待或采取其他措施,从而避免在死锁或长时间等待时的无效阻塞。
    if (lock.tryLock()) {try {// 执行需要同步的代码} finally {lock.unlock();}
    }
    
  4. 锁的公平性

    • ReentrantLock 可以配置为公平锁,这样当多个线程争夺锁时,会按照请求锁的顺序来处理,避免了“饥饿”情况。
    Lock lock = new ReentrantLock(true); // 公平锁
    
  5. 条件变量支持

    • ReentrantLock 提供了 Condition 对象,可以实现更灵活的等待/通知机制,例如多个条件的通知,可以用 await()signal() 方法来实现。
    Condition condition = lock.newCondition();
    condition.await();
    condition.signal();
    
  6. 更大的控制范围

    • 由于提供了更加灵活的 API,开发者可以更好地控制锁的获取和释放时机,从而改善程序的结构和可读性。

总结

虽然 synchronized 提供了简单的互斥机制,但在高并发场景下存在性能和灵活性不足的缺陷。Java 的 Lock 接口及其实现(尤其是 ReentrantLock)通过提供可中断、超时、公平性以及条件变量等功能,极大地增强了线程同步的灵活性和效率。因此,在需要高并发和复杂线程管理的场景中,Lock 是更推荐的选择。如果你有其他问题或需要更详细的解释,请随时在评论区留言探讨!

http://www.lryc.cn/news/438306.html

相关文章:

  • 联合仿真(FMI,FMU)资料收集
  • Android Radio2.0——动态列表回调(七)
  • 在conda虚拟环境中安装cv2(试错多次总结)
  • 【EI稳定,马来亚大学主办】2024年计算机与信息安全国际会议(WCCIS 2024,9月27-29)
  • 免费AI播客生成:notebooklm可以生成播客的两个发言人谈论的内容,从各种来源如研究论文、文章
  • “MIME 媒体类型“用来标识网络传输内容的格式标准
  • MySql的基础讲解
  • 类型转换等 面试真题
  • MySQL下载安装
  • golang实现正向代理http_proxy和https_proxy
  • 数字IC设计\FPGA 职位经典笔试面试--整理
  • Golang协程泄漏定位和排查
  • 【我的 PWN 学习手札】Unlink Attack
  • 算法笔试-编程练习-好题-04
  • 使用Rustup快速无缝升级Rust
  • pytorch qwen2-vl自定义数据全量微调
  • 切换淘宝最新npm镜像源是
  • 全国历年高考真题2008-2024
  • 【vue-media-upload】一个好用的上传图片的组件,注意事项
  • linux第一课(操作系统核心)
  • 【期末复习】软件项目管理
  • C# List定义和常用方法
  • 如何在实际应用中更好地利用字典功能提高开发效率?
  • Windows 环境下 vscode 配置 C/C++ 环境
  • [通信原理]绪论2:信息量 × 信息熵
  • TCP套接字【网络】
  • 【devops】devops-git之github使用
  • GPT对话知识库——串口通信的数据的组成?起始位是高电平还是低电平?如何用代码在 FreeRTOS 中实现串口通信吗?如何处理串口通信中的数据帧校验吗?
  • 从头开始学MyBatis—02基于xml和注解分别实现的增删改查
  • AI音乐创作的新时代:从创意到旋律的智能化转型