非公平锁就是会通过两次CAS去抢占锁
时间: 2024-05-20 15:14:09 浏览: 9
非公平锁是指当一个线程尝试获取锁时,如果锁没有被占用,则立即获取锁,否则就会通过两次 CAS 操作去抢占锁。在使用非公平锁时,如果有多个线程在等待同一个锁,那么后来的线程可能会在先前的线程之前获取到锁,因此非公平锁的效率可能会更高一些。不过,由于非公平锁可能会导致线程饥饿,所以在某些情况下,使用公平锁会更合适。
相关问题
非公平锁获取线程的规则
非公平锁在获取锁时并不遵循先到先得的原则,它允许新来的线程插队获取锁,可能会导致已经等待的线程长时间无法获取到锁。
非公平锁获取线程的规则如下:
1. 当一个线程请求非公平锁时,如果锁是空闲的,则该线程直接获取到锁。
2. 如果锁已经被其他线程持有,则新来的线程会尝试获取锁。
3. 如果新来的线程能够成功获取到锁,则它可以立即执行。这个过程是通过CAS(Compare and Swap)操作实现的,即利用原子性操作判断锁是否被占用,如果没有被占用,则将其设置为自己持有。
4. 如果新来的线程尝试获取锁失败(即被其他线程插队了),则它会进入等待队列。等待队列中的线程会按照先进先出的顺序等待,直到轮到它们重新尝试获取锁为止。
非公平锁的特点是允许新来的线程插队获取锁,这样可能会导致已经在等待的线程长时间无法获取到锁,造成不公平性。但相对于公平锁,非公平锁能够带来更高的吞吐量,因为减少了线程的切换和调度开销。
需要注意的是,非公平锁的获取规则在不同的环境和实现中可能会有所差异,具体的行为可能受到底层操作系统的调度策略等因素的影响。因此,在使用非公平锁时,需要根据具体情况评估其对应用程序性能和公平性的影响,并进行合理的选择。
ReentrantLock 是如何实现公平锁的?ReentrantLock 是如何实现非公平锁的
ReentrantLock 类提供了公平锁和非公平锁两种模式,默认情况下是非公平锁。
在公平锁模式下,线程获取锁的顺序是按照请求锁的先后顺序进行的,即先请求的线程先获取锁。为了实现公平锁,ReentrantLock 内部维护了一个 FIFO 队列,所有请求锁的线程都会进入这个队列。当锁被释放时,队列中的第一个线程将会获得锁。
在非公平锁模式下,线程获取锁的顺序是不确定的,也就是说后请求的线程有可能先获取到锁。当一个线程请求非公平锁时,它会先尝试直接获取锁,如果获取失败,才会将自己加入等待队列中。如果锁被释放时,等待队列中有线程,那么队列中的第一个线程才会尝试获取锁。
在实现非公平锁时,ReentrantLock 采用了“CAS 自旋”技术,即线程会不断尝试获取锁,而不是直接进入等待队列。这可以减少线程进入等待队列的次数,从而提高锁的性能。但是由于非公平锁的获取顺序是不确定的,因此有可能会导致某些线程一直无法获取到锁,从而出现“饥饿”现象。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)