在 Java 中 synchronized 和 ReentrantLock 默认使用的都是非公平锁,而它们采用非公平锁的原因都是一致的,都是为了提升程序的性能。那为什么非公平锁就能提升性能呢?接下来我们一起来看。
非公平锁
非公平锁:每个线程获取锁的顺序是随机的,并不会遵循先来先得的规则,任何线程在某时刻都有可能直接获取并拥有锁。
这就好比磊哥去加油,到了加油站之后发现前面有人在加,于是我就在车里刷起了抖音,过了一会,前面的车加完油走了,但磊哥没注意到,还在车里愉快的刷着抖音。然而此时加油站又来了一辆车,发现有空闲的油枪,于是就抢先在磊哥之前把油加了。这里的油枪就是锁,没有按照到达的先后顺序得到油枪,这就是非公平锁。
公平锁
公平锁:每个线程获取锁的顺序是按照线程访问锁的先后顺序获取的,最前面的线程总是最先获取到锁。
这就好像上高速排队过收费站一样,所有的车要排队等待通行,最先来的车最先通过收费站。