【面试问题】Synchronized 和 ReentrantLock 区别?

简介: 【1月更文挑战第27天】【面试问题】Synchronized 和 ReentrantLock 区别?

SynchronizedReentrantLock 都是 Java 中用于实现线程同步的机制,它们都提供了互斥访问共享资源的能力。下面是它们之间的主要区别:

1. 实现方式:

  • Synchronized:
  • synchronized 是 Java 内置的关键字,用于实现原子性的操作和线程的同步。它隐式地获取和释放锁,不需要手动操作。
  • 在方法上使用 synchronized 关键字时,锁定的是整个方法体;在代码块中使用时,锁定的是代码块。
  • synchronized 有可重入性,同一个线程可以重复获得同一把锁。
publicsynchronizedvoidsynchronizedMethod() {
// synchronized 代码块// ...}

ReentrantLock:

  • ReentrantLockjava.util.concurrent.locks 包下的类,提供了显式地锁定和解锁的机制。
  • 使用 ReentrantLock 需要手动调用 lock() 方法进行加锁,然后在 finally 块中调用 unlock() 方法进行解锁。
  • ReentrantLock 同样支持可重入性,同一个线程可以重复获得同一把锁。
importjava.util.concurrent.locks.ReentrantLock;
publicclassReentrantLockExample {
privatefinalReentrantLocklock=newReentrantLock();
publicvoidlockedMethod() {
lock.lock();
try {
// 代码块// ...        } finally {
lock.unlock();
        }
    }
}

2. 可中断性:

  • Synchronized:
  • synchronized 不支持中断,即一个线程进入了同步代码块,其他线程需要等待。
  • ReentrantLock:
  • ReentrantLock 提供了可中断的锁,即一个线程在等待锁的过程中,可以被中断,不需要一直等待。
ReentrantLocklock=newReentrantLock();
publicvoidinterruptibleMethod() {
try {
lock.lockInterruptibly(); // 可中断锁定// 代码块// ...    } catch (InterruptedExceptione) {
e.printStackTrace();
    } finally {
lock.unlock();
    }
}

3. 公平性:

  • Synchronized:
  • synchronized 是非公平锁,即线程获取锁的顺序是不确定的。
  • ReentrantLock:
  • ReentrantLock 支持公平锁和非公平锁,默认情况下是非公平锁,但可以通过构造函数指定为公平锁。

4. 条件变量:

  • Synchronized:
  • synchronized 不支持显式的条件变量,但可以使用 Objectwait()notify()notifyAll() 方法实现基本的等待和通知机制。
  • ReentrantLock:
  • ReentrantLock 提供了 Condition 接口,可以通过 newCondition() 方法创建一个与锁相关的条件变量,用于线程之间的通信和协调。
ReentrantLocklock=newReentrantLock();
Conditioncondition=lock.newCondition();
publicvoidconditionMethod() throwsInterruptedException {
lock.lock();
try {
// 代码块// ...// 等待条件condition.await();
// 唤醒等待的线程condition.signal();
    } finally {
lock.unlock();
    }
}

5. 性能:

  • Synchronized:
  • synchronized 是 JVM 实现的关键字,属于底层操作,因此在性能上相对较好。
  • ReentrantLock:
  • ReentrantLock 是基于 AbstractQueuedSynchronizer 实现的,相对于 synchronized 有更多的操作,因此性能相对较低。但在高并发的情况下,ReentrantLock 的性能可能更好。
相关文章
|
4天前
|
存储 Java 开发者
面试官:小伙子知道synchronized的优化过程吗?我:嘚吧嘚吧嘚,面试官:出去!
面试官:小伙子知道synchronized的优化过程吗?我:嘚吧嘚吧嘚,面试官:出去!
19 1
|
1月前
|
编译器 C++ Python
【C/C++ 泡沫精选面试题02】深拷贝和浅拷贝之间的区别?
【C/C++ 泡沫精选面试题02】深拷贝和浅拷贝之间的区别?
33 1
|
19天前
|
安全 Java
大厂面试题详解:synchronized的偏向锁和自旋锁怎么实现的
字节跳动大厂面试题详解:synchronized的偏向锁和自旋锁怎么实现的
9 0
|
19天前
|
Java 关系型数据库 MySQL
大厂面试题详解:Java抽象类与接口的概念及区别
字节跳动大厂面试题详解:Java抽象类与接口的概念及区别
40 0
|
25天前
|
存储 JSON Java
面试官:Session和JWT有什么区别?
JSON Web Token (JWT) 是一种开放标准,用于安全地在网络上传输信息。JWT 包含头部、载荷和签名三部分,常用于身份验证和授权。与Session相比,JWT有以下优势:无服务器存储状态,支持跨域,适应微服务架构,自包含且可扩展。在Java开发中,可以使用HuTool框架操作JWT,包括生成、验证和解析Token。JWT通过在客户端存储令牌实现无状态认证,与Session的主要区别在于工作原理、存储方式和有效期管理。
32 6
|
1月前
|
消息中间件 算法 Java
面试官:Kafka和ES选主有什么区别?
Kafka 和 ES,作为大数据处理的中间件,分别用于流处理和全文检索。它们的选主(Kafka 的 Controller 和 ES 的 Master)都基于 Raft 算法实现一致性。Raft 算法通过选举确保分布式系统数据一致性,涉及领导者、追随者和候选人间的身份转换。当超过一半的节点投票给同一候选节点时,该节点成为新领导者。Kafka 和 ES 在此基础上可能有各自优化调整。更多关于 Raft 算法的详细流程和选举规则见原文。
44 2
|
1月前
|
网络协议 网络性能优化
网络面试题:TCP和UDP的区别
网络面试题:TCP和UDP的区别
25 0
|
1月前
|
监控
嵌入式面试题:数据传输单工,半双工,全双工之间的区别
嵌入式面试题:数据传输单工,半双工,全双工之间的区别
14 0
|
30天前
|
Java 程序员
java线程池讲解面试
java线程池讲解面试
53 1
|
2月前
|
存储 关系型数据库 MySQL
2024年Java秋招面试必看的 | MySQL调优面试题
随着系统用户量的不断增加,MySQL 索引的重要性不言而喻,对于后端工程师,只有在了解索引及其优化的规则,并应用于实际工作中后,才能不断的提升系统性能,开发出高性能、高并发和高可用的系统。 今天小编首先会跟大家分享一下MySQL 索引中的各种概念,然后介绍优化索引的若干条规则,最后利用这些规则,针对面试中常考的知识点,做详细的实例分析。
252 0
2024年Java秋招面试必看的 | MySQL调优面试题