举一个通俗的例子来解释一下什么是公平锁和非公平锁,拿银行排队举例。
公平锁模式:
我到了银行,看看是否排队,如果不排队,则直接去柜台办理业务。(没有加锁的情况)
如果排队,则需要去前台取号,后续按照叫号依次办理业务。(加锁情况下需要排队)
这样有一个缺陷,每次叫号时,所有人都会听到声音,看一下是否到了自己的号。本来我闭目养神的,也要醒过来看一看是否到了自己,如果没有到自己,则继续闭目养神。即使叫到了我的号,我还得起身收拾一下所有材料,走到前台去办理业务,这时候柜台自然是等着我过去办理业务的,有等待时间,所以效率自然比较低。(释放锁时唤醒所有线程,线程会有一个状态切换的过程,浪费性能)
所以最终结果是很公平,但是柜台处理效率不高。(效率高,但是不公平)
非公平锁模式:
我的到了银行,如果不排序,一样直接去柜台办理业务。(没有加锁的情况)
如果排队,则我随便找一个位置坐下来。这时候又来了一个人,刚好叫号,则他直接就开始办理业务了,银行柜台没有等待时间。(有的线程不需要排队即可直接获取到锁)
即使没有恰好有人来,柜台也会叫一下有空啦,抓紧来办理业务。这时候距离最近的那个人自然快步上前办理业务,柜台就算等,等待时间也比较短,因为人家离得近呀。(有的情况下虽然排队,但不是按照顺序排队,而且是按照距CPU更适合执行的顺序来排队)
所以最终结果是虽然我先来的,却没有先办理业务。对我来说不公平,但是柜台减少了等待时间,处理业务的效率上是最快的。(效率高,但是不公平)