【面试问题】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 的性能可能更好。
相关文章
|
存储 安全 Java
面试高频:Synchronized 原理,建议收藏备用 !
本文详解Synchronized原理,包括其作用、使用方式、底层实现及锁升级机制。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
面试高频:Synchronized 原理,建议收藏备用 !
|
存储 安全 Java
面试题:再谈Synchronized实现原理!
面试题:再谈Synchronized实现原理!
281 0
|
存储 安全 Java
【多线程面试题十七】、如果不使用synchronized和Lock,如何保证线程安全?
这篇文章探讨了在不使用`synchronized`和`Lock`的情况下保证线程安全的方法,包括使用`volatile`关键字、原子变量、线程本地存储(`ThreadLocal`)以及设计不可变对象。
【多线程面试题十六】、谈谈ReentrantLock的实现原理
这篇文章解释了`ReentrantLock`的实现原理,它基于Java中的`AbstractQueuedSynchronizer`(AQS)构建,通过重写AQS的`tryAcquire`和`tryRelease`方法来实现锁的获取与释放,并详细描述了AQS内部的同步队列和条件队列以及独占模式的工作原理。
【多线程面试题十六】、谈谈ReentrantLock的实现原理
【多线程面试题十五】、synchronized可以修饰静态方法和静态代码块吗?
这篇文章讨论了Java中的`synchronized`关键字是否可以修饰静态方法和静态代码块,指出`synchronized`可以修饰静态方法,创建一个类全局锁,但不能修饰静态代码块。
|
Java 调度
【多线程面试题十四】、说一说synchronized的底层实现原理
这篇文章解释了Java中的`synchronized`关键字的底层实现原理,包括它在代码块和方法同步中的实现方式,以及通过`monitorenter`和`monitorexit`指令以及`ACC_SYNCHRONIZED`访问标志来控制线程同步和锁的获取与释放。
【多线程面试题十三】、说一说synchronized与Lock的区别
这篇文章讨论了Java中`synchronized`和`Lock`接口在多线程编程中的区别,包括它们在实现、使用、锁的释放、超时设置、锁状态查询以及锁的属性等方面的不同点。
|
安全 Java
Java面试题:解释synchronized关键字在Java内存模型中的语义
Java面试题:解释synchronized关键字在Java内存模型中的语义
216 1
|
安全 Java API
Java面试题:解释synchronized关键字在Java中的作用,并讨论其使用场景和限制。
Java面试题:解释synchronized关键字在Java中的作用,并讨论其使用场景和限制。
236 0
|
存储 安全 Java
Java面试题:请解释Java内存模型,并说明如何在多线程环境下使用synchronized关键字实现同步,阐述ConcurrentHashMap与HashMap的区别,以及它如何在并发环境中提高性能
Java面试题:请解释Java内存模型,并说明如何在多线程环境下使用synchronized关键字实现同步,阐述ConcurrentHashMap与HashMap的区别,以及它如何在并发环境中提高性能
257 0