Java 中什么是可重入锁?

· 约 3 分钟读完 · 第 99 / 274 章

推荐答案

在Java中,可重入锁(ReentrantLock)是一种同步机制,它允许同一个线程多次获取同一把锁。可重入锁提供了与synchronized关键字类似的功能,但具有更高的灵活性和扩展性。可重入锁的主要特点是,如果一个线程已经持有该锁,它可以再次获取该锁而不会被阻塞,这种特性称为“可重入性”。

本题详细解读

可重入锁的基本概念

可重入锁是java.util.concurrent.locks包中的一个类,名为ReentrantLock。它实现了Lock接口,提供了比synchronized更丰富的锁操作功能。可重入锁的核心思想是,同一个线程可以多次获取同一把锁,而不会导致死锁。

可重入锁的使用场景

可重入锁通常用于需要更细粒度控制的同步场景。例如,当一个线程在持有锁的情况下,需要再次进入同一个锁保护的代码块时,可重入锁可以避免线程被自己阻塞。

可重入锁的示例代码

在这个示例中,outer方法获取了锁,然后在持有锁的情况下调用了inner方法,inner方法再次获取了同一把锁。由于ReentrantLock是可重入的,线程不会被阻塞。

可重入锁的特性

  1. 可重入性:同一个线程可以多次获取同一把锁。
  2. 公平性:ReentrantLock可以配置为公平锁或非公平锁。公平锁会按照线程请求锁的顺序来分配锁,而非公平锁则允许插队。
  3. 可中断性:ReentrantLock提供了lockInterruptibly方法,允许线程在等待锁的过程中响应中断。
  4. 超时机制:ReentrantLock提供了tryLock方法,允许线程在指定的时间内尝试获取锁,超时后放弃。

可重入锁与synchronized的对比

  • 灵活性:ReentrantLock提供了更多的控制选项,如公平性、可中断性等。
  • 性能:在低竞争情况下,synchronized的性能通常优于ReentrantLock,但在高竞争情况下,ReentrantLock的性能可能更好。
  • 可扩展性:ReentrantLock可以与其他java.util.concurrent工具类更好地集成。

总结

可重入锁是Java中一种强大的同步工具,适用于需要更细粒度控制的并发场景。它提供了比synchronized更多的功能,但也需要开发者手动管理锁的获取和释放,以避免潜在的死锁问题。