欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 资讯 > 跟 Synchronized 相比,可重入锁 ReentrantLock 其实现原理有什么不同?

跟 Synchronized 相比,可重入锁 ReentrantLock 其实现原理有什么不同?

2024/12/22 11:59:42 来源:https://blog.csdn.net/2401_87790788/article/details/144196848  浏览:    关键词:跟 Synchronized 相比,可重入锁 ReentrantLock 其实现原理有什么不同?

与Synchronized相比,可重入锁ReentrantLock在实现原理上存在显著差异。以下是对两者实现原理的详细比较:

一、基本机制

  1. Synchronized
    • 是JVM基于监视器(Monitor)的实现,提供的内置锁。
    • 每个对象都有一个监视器锁,当线程进入synchronized代码块时,会尝试获得该对象的监视器锁。
    • 如果获取成功,线程可以执行代码块;如果获取失败,线程将被阻塞,等待锁释放。
  2. ReentrantLock
    • 是基于可重入锁的可重入锁AbstractQueuedSynchronizer(AQS)的实现。
    • AQS是用于实现同步器的框架,ReentrantLock利用了AQS实现锁定功能的一些特点。
    • ReentrantLock提供了更多的控制和功能,如公平锁、非公平锁、可中断获取锁、超时获取锁等。

二、锁获取与释放

  1. Synchronized
    • 隐式地获取和释放锁,即代码执行完毕后自动释放锁。
    • 线程进入synchronized代码块时自动获取锁,离开时自动释放锁。
  2. ReentrantLock
    • 显式地获取和释放锁,需要程序员手动调用lock()和unlock()方法。
    • 必须在finally块中释放锁,以确保在发生异常时锁也能被正确释放。

三、锁类型与特性

  1. Synchronized
    • 支持重入性,即同一线程可以多次获得同一个锁而不会导致死锁。
    • 不可响应中断,一个线程获取不到锁时会一直等待。
    • 不提供公平锁机制,锁的分配是随机的。
  2. ReentrantLock
    • 同样支持重入性。
    • 可以响应中断,即线程在等待锁时可以选择放弃等待。
    • 提供公平锁和非公平锁两种模式。公平锁按照线程请求锁的顺序来分配锁,非公平锁则可能允许插队。

四、条件变量与等待/通知机制

  1. Synchronized
    • 使用内置的条件变量(隐式地通过wait/notify/notifyAll方法)。
    • 线程可以在获取锁后调用wait()方法进入等待状态,直到其他线程调用notify()或notifyAll()方法唤醒。
  2. ReentrantLock
    • 提供Condition接口,允许线程在获得锁后等待特定的条件满足后再执行。
    • Condition接口提供了await()、signal()和signalAll()等方法,与synchronized的wait/notify/notifyAll方法类似,但更加灵活和强大。

五、性能与适用场景

  1. Synchronized
    • 由于是JVM内置锁,性能通常较高,且使用简单。
    • 适用于不需要特别高的灵活性和控制能力的场景。
  2. ReentrantLock
    • 性能可能因实现细节和锁类型(公平锁/非公平锁)而有所不同。
    • 提供了更多的控制和功能,适用于需要更高灵活性和控制能力的场景。

综上所述,Synchronized和ReentrantLock在实现原理上存在显著差异,主要体现在锁获取与释放、锁类型与特性、条件变量与等待/通知机制以及性能与适用场景等方面。开发者在选择使用哪种锁时,应根据具体的应用场景和需求进行权衡和选择。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com