公平锁
- 队列抢锁,线程1抢到锁后释放后,给线程2,新来的线程排到队列最后,未防止某个线程长时间占用队列,底层采用zset存储每个线程的等待时长,如果超过等待时长,将对应的线程踢出队列。
非公平锁
- 不需要进入队列排队,来一个线程就加入到竞争锁中,谁抢到是谁的
公平锁跟非公平锁哪个效率高?
本质原因是因为公平锁需要加到阻塞队列排队,还需要加到zset,这就额外需要两次redis操作,非公平锁,其他线程来抢锁了,完全不丢到阻塞队列里,所以直接执行。省去了很多啰嗦的步骤。
公平锁的核心就是三个数据结构:hash存储锁以及重入次数、list进行排队保证公平性、zset来完成锁等待时长。