【后端面经-Java】Synchronize和ReentrantLock区别

这篇具有很好参考价值的文章主要介绍了【后端面经-Java】Synchronize和ReentrantLock区别。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 概念介绍

1.1 线程安全锁

Synchronize(同步锁)和ReentrantLock(可重入锁)都是Java中的常用锁,都是用来保证线程安全的。
两者都是同步锁,且都是阻塞同步。

  • 阻塞同步:当一个线程获取锁后,其他线程只能等待(进入阻塞态),等待获取锁的线程释放锁后,其他线程才能获取锁。

1.2 公平锁

在多个线程请求资源的时候,如果根据线程请求的顺序来分配资源,那么这个锁就是公平锁,反之就是非公平锁。

1.3 响应中断/等待可中断

在线程阻塞期间,阻塞线程等待资源的使用,如果这种等待状态能够被中断,从而释放线程去做其他的事情,这就称为等待可中断

2. 区别

2.1 底层实现

Synchronize是Java的关键字,ReentrantLock是Java类。因此,Synchronize是JVM层面语法层面的同步锁,ReentrantLock是API层面的同步锁

2.2 锁的用法

  1. 设置锁和释放锁:Synchroinze是自动加锁和释放锁的,ReentrantLock设置和释放都需要手动操作;
  2. 修饰的对象:Synchroinze可以修饰方法和代码块,ReentrantLock只能修饰代码块

如下代码展示了它们的具体用法:

  • Synchronize作为关键字修饰方法或者代码块即可;
//synchronized修饰一个方法时,这个方法叫同步方法。
public synchronized void test() {
//方法体``
}
synchronizedObject{
//括号中表示需要锁的对象.
//线程执行的时候会对Object上锁
}
  • ReentrantLock的使用需要先创建锁对象,然后在需要加锁的代码块中调用lock()方法加锁,使用完毕后调用unlock()方法释放锁。
public class LockExample {
    // 创建锁对象
    private final ReentrantLock lock = new ReentrantLock();
    public void method() {
        // 加锁操作
        lock.lock();
        try {
            // ...
        } finally {
            // 释放锁
            lock.unlock();
        }
    }
}

2.3 锁的特点

ReentrantLock相比于Synchronize,有以下特点:

  • 响应中断:ReentrantLock可以响应中断,也就是在其他线程阻塞期间,可以在长时间无法获取响应的情况下,自行中断等待状态
  • 公平锁:ReentrantLock默认是不公平锁,但是可以设置为公平锁,也就是可以根据线程请求的顺序来分配资源
  • 绑定多个条件:一个ReentrantLock可以同时绑定多个条件,而一个Synchronize锁只能绑定一个条件。

这些特点都是Synchronize锁所不具备的。

2.4 性能比较

Sychronize是JVM层面的同步锁,实现简单,性能较好;
ReentrantLock是API层面的同步锁,需要手动创建和释放锁,性能较差,但是增加了很多特点,灵活性较好。

2.5 适用场景

Synchronize适用于:

  • 简单的同步场景;
  • 对同步性能有较高要求
  • 不需要响应中断、公平锁、绑定多个条件;
    ReentrantLock适用于:
  • 需求更复杂的同步场景
  • 对性能要求较低
  • 需要响应中断、公平锁、绑定多个条件;

3. 总结比较

对上述内容进行总结,如下表所示:
【后端面经-Java】Synchronize和ReentrantLock区别文章来源地址https://www.toymoban.com/news/detail-506162.html

参考文献

  1. Synchronize和ReentrantLock区别
  2. 面试突击:synchronized和ReentrantLock有什么区别?
  3. Java 中 synchronized 和 ReentrantLock 的区别

到了这里,关于【后端面经-Java】Synchronize和ReentrantLock区别的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ReentrantLock介绍及使用(超详细)

    点击  Mr.绵羊的知识星球  解锁更多优质文章。 目录 一、介绍 1. 简介 2. 是什么类型的锁 3. 优点 4. 原理 5. 主要方法 6. 使用时注意事项 二、实际应用 1. 案例一 2. 案例二     ReentrantLock是一种基于AQS(Abstract Queued Synchronizer)框架的应用实现,是JDK中一种线程并发访问的同步手段

    2024年02月07日
    浏览(31)
  • 【后端面经-数据库】Redis详解——Redis基本概念和特点

    目录 1. Redis基本概念 2. Redis特点 2.1 优点 2.2 缺点 3. Redis的应用场景 面试模拟 参考资料 声明:Redis的相关知识是面试的一大热门知识点,同时也是一个庞大的体系,所涉及的知识点非常多,如果用一篇文章罗列,往往会陷入知识海洋中无法感知其全貌,因此,这段时间我会试

    2024年02月13日
    浏览(52)
  • 【后端面经-计算机基础】HTTP和TCP的区别

    目录 【后端面经-计算机基础】HTTP和TCP的区别 1. OSI七层模型和相关协议 2. TCP协议 2.1 特点: 2.2 报文格式 2.3 三次握手和四次挥手 3. HTTP协议 3.1 特点 3.2 报文格式 3.2 https和http 4. HTTP vs TCP 5. 面试模拟 参考资料 在计算机网络的学习中,OSI七层结构是一个很重要的概念。 七层模

    2024年02月12日
    浏览(53)
  • 【后端面经】MySQL主键、唯一索引、联合索引的区别和作用

    目录 0. 简介 1. 主键 2. 唯一索引 3. 联合索引 4. 索引对数据库操作的影响 5. 其他索引 5.1 普通索引 5.2 全文索引 5.3 前缀索引 6. 总结 7. 参考资料 索引是一类特殊的 文件 ,用来存储检索信息,使数据库查找更加快速。 主键是一类特殊的唯一索引,选择某一列元素作为主键,用

    2024年02月09日
    浏览(48)
  • Java中的ReentrantLock实现原理

    在并发编程中,线程安全问题一直是非常重要的问题。Java中提供了多种解决线程安全问题的机制,其中一个比较常用的就是ReentrantLock。本文将介绍ReentrantLock的实现原理,从原子性、可见性等方面解释并结合源码分析,以便更好地理解在多线程环境下实现线程安全的过程。

    2024年02月01日
    浏览(43)
  • java ReentrantLock 锁 await、signal的用法

    在并发编程中,为了保证线程的原子执行,需要使用锁,jvm 内 可以使用 synchronized 和 ReentrantLock,如果是集群部署,我们可以使用Redis 分布式锁 其他的锁后面再介绍。 1、ReentrantLock 通过方法 lock()与 unlock()来进行加锁与解锁操作,与synchronized(1.8之后性能得到提升)会被JVM自动

    2024年02月11日
    浏览(77)
  • 深入浅出 Java 中的神锁:ReentrantLock,还有谁不会?

    来源:jiannan.blog.csdn.net/article/details/121331360 话不多说,扶我起来,我还可以继续撸。 在学习 ReentrantLock 源码之前,先来回顾一下链表、队列数据结构的基本概念~~ 小学一、二年级的时候,学校组织户外活动,老师们一般都要求同学之间小手牵着小手。这个场景就很类似一

    2024年02月08日
    浏览(47)
  • 深入源码解析 ReentrantLock、AQS:掌握 Java 并发编程关键技术

    🔭 嗨,您好 👋 我是 vnjohn,在互联网企业担任 Java 开发,CSDN 优质创作者 📖 推荐专栏:Spring、MySQL、Nacos、Java,后续其他专栏会持续优化更新迭代 🌲文章所在专栏:JUC 🤔 我当前正在学习微服务领域、云原生领域、消息中间件等架构、原理知识 💬 向我询问任何您想要的

    2024年02月11日
    浏览(51)
  • Java后端面试题——Mysql篇

    在Mysql中,如何定位慢查询呢? 表象:页面加载过慢、接口压测响应时间过长(超过1s) 原因: 聚合查询 多表查询 表数据量过大查询 深度分页查询 方案:MySQL自带慢日志 需要在MySQL的配置文件(/etc/my.cnf)中配置如下信息: # 开启MySQL慢日志查询开关 slow_query_log=1 # 设置慢日

    2024年02月12日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包