在技术日新月异的今天,真正应该花费时间学习的是那些不变的编程思想,那么今天我们来聊一下公平和非公平策略的思想,前几天看到一个问题”为什么synchronized是非公平的“,我仔细的思考了一下,发现不只是synchronized, ReentrantLock 的默认策略也是非公平的,非公平是实现锁的一种策略,不只是Java,其他语言的默认锁机制也都是非公平的,那么今天我们来详细的聊一下 ”为什么各种语言中锁实现的默认策略都是非公平的“ 。这个非公平是真的完全不公平随机获取的么?
公平和非公平
首先,我们来看下什么是公平锁和非公平锁,为了能让大家更清楚,我们用图例来说明一下公平和非公平的场景。
公平锁的场景
我们先看一下公平锁的场景,顾名思义,公平锁指的就是按照线程请求的顺序来分配锁; 比如,我们给临界区加了一个公平锁,此时有3个线程先后来请求锁,线程1先到,就会先获得锁,那么线程2,3会在队列中等待,等线程1释放锁后,线程2,3会依次去获得锁,如果此时有线程4来竟争锁,会排在线程2,3的后面等待。
然后等线程 1 释放锁之后,线程 2、3、4 会依次去获取这把锁,线程 2 先获取到的原因是它等待的时间最长。