// 默认非公平锁 true表示公平锁
ReentrantLock lock = new ReentrantLock();
公平锁:按序排队,会判断同步队列是否还有前驱节点存在,如果没有前驱节点才能获取锁;
非公平锁:先占先得,不管有没有前驱节点,只要能抢到锁就可以
为什么会有公平锁和非公平锁?为什么默认非公平锁?
1、恢复挂起的线程到真正锁的获取还是有时间差的,从开发人员来看这个时间微乎其微,但是从cpu的角度来看,这个时间差还是很明显的,所以非公平锁能更充分地利用cpu的时间片,尽量减少cpu空闲状态时间。
2、使用多线程很重要的考量点是线程切换的开销,当采用非公平锁时,当一个线程请求锁获取同步状态,然后释放同步动态,因为不需要考虑是否还有前驱节点,所以刚释放锁的线程在此刻再次获取同步状态的概率非常大,所以就减少了线程切换的开销。
非公平锁的问题?
可能会出现锁饥饿现象:可能导致排队的长时间在排队,没有机会获取到锁。
什么时候用公平?什么时候用非公平?
如果要提高吞吐量,显然是非公平锁更合适,因为避免了很多线程切换的开销,吞吐量自然就上去了;否则就使用公平锁,大家公平使用。
进微信群和大佬面对面学习交流👇🏻👇🏻👇🏻