V-xin:ruyuanhadeng获得600+页原创精品文章汇总PDF
一、写在前面
上篇文章:《SpringBoot3.0都正式发布了,尝鲜之前先搞明白AQS底层再说!》聊了一下java并发包中的AQS的工作原理,也间接说明了ReentrantLock的工作原理。
这篇文章接着来聊一个话题,java并发包中的公平锁与非公平锁有啥区别?
二、什么是非公平锁?
先来聊聊非公平锁是啥,现在大家先回过头来看下面这张图。
如上图,现在线程1加了锁,然后线程2尝试加锁,失败后进入了等待队列,处于阻塞中。然后线程1释放了锁,准备来唤醒线程2重新尝试加锁。
注意一点,此时线程2可还停留在等待队列里啊,还没开始尝试重新加锁呢!
然而,不幸的事情发生了,这时半路杀出个程咬金,来了一个线程3!线程3突然尝试对ReentrantLock发起加锁操作,此时会发生什么事情?
很简单!线程2还没来得及重新尝试加锁呢。也就是说,还没来得及尝试重新执行CAS操作将state的值从0变为1呢!线程3冲上来直接一个CA