lock公平锁和非公平锁实现原理
时间: 2024-09-09 09:02:47 浏览: 45
ReentrantLock源码详解--公平锁、非公平锁
5星 · 资源好评率100%
在多线程编程中,锁是一种同步机制,用于控制多个线程对共享资源的互斥访问。公平锁和非公平锁是锁的两种类型,它们的区别主要在于线程获取锁的顺序。
公平锁(Fair Lock):
公平锁是指按照请求锁的线程的先来后到顺序来分配锁。也就是说,在锁可用时,最先请求锁的线程将会获得锁。为了实现这个机制,通常会维护一个等待队列。当一个线程释放锁时,锁会首先查看等待队列中是否有其他线程在等待这个锁,如果有,则按队列的顺序将锁分配给等待时间最长的线程。
非公平锁(Non-fair Lock):
非公平锁则不保证线程获取锁的顺序。当锁被释放时,它不会去检查等待队列,而是直接尝试获取锁。如果此时没有其他线程正在使用锁,那么当前线程就可以直接获取锁。这种锁的优点是线程获取锁的开销较小,因为避免了检查和维护等待队列的开销,但是这也可能导致某些线程长时间无法获取到锁,从而在某些情况下造成饥饿问题。
实现原理:
- 公平锁通常是通过维护一个先进先出的队列来实现的。在JDK中,像ReentrantLock这样的类提供了公平锁的实现。在内部,它使用一个名为FairSync的同步器来管理锁状态和等待队列。
- 非公平锁则没有维护队列,当锁可用时,它只是简单地检查锁状态。如果锁未被占用,则直接将锁分配给请求者。ReentrantLock的默认构造函数创建的就是一个非公平锁,它使用的是NonfairSync同步器。
阅读全文