被人问到自旋锁互斥锁,公平锁非公平锁,知道点还是好的~

257 阅读2分钟

「这是我参与11月更文挑战的第19天,活动详情查看:2021最后一次更文挑战

自旋锁,互斥锁

概述:

自旋锁和互斥锁相似,都是实现保护共享资源而提出的一种锁的机制,在任何时刻只有一个执行单元可以获取该锁,如果锁被其他单元占用着,那么调用者便会进行CPU空转消耗并且时刻关注着该锁是否被释放,直到自己获取到该锁为止。

特点:

  • 自旋锁是一种轻量级的锁,在有别的线程获取了该锁,需要进行自旋等待的时候,CPU依然占用着线程资源不放,不会切换到其他线程去执行,因此在等待时间较长的时候是不适用自旋锁的,这样会白白消耗CPU性能。

  • 互斥锁在需要等待的时候,不会进行空转消耗CPU,他会阻塞并且切换到别的线程执行,发生一次上下文切换,这也是比较耗时的操作,在重新切换到该线程的时候,就又发生了一次上下文切换。

  • 在锁竞争不繁忙,和该锁保持的代码执行时间较短的时候,是可以使用自旋锁的,这样不会因为等待时间过长白白消耗CPU的性能。

公平锁和非公平锁

  • 公平锁相当于买票,后来的人需要排队依次买票,不能插队

  • 非公平锁则没有这些规则,是抢占式的,每来一个人不会管队列如何,直接尝试获取锁。

  • 获取锁:还有重要区别就是在尝试获取锁时,非公平锁是不需要判断队列中是否还有其他线程,也是直接尝试获取锁。

  • 释放锁:两者都是一样的,首先判断当前线程是否是获得锁的线程,由于是重入锁所以需要将state减到0才认为完全释放锁。释放之后需要调用unparkSuccessor(h)来唤醒被挂起的线程。

  • 由于公平锁需要关心队列的情况,得按照队列里的先后顺序来获取锁(会造成大量的线程上下切换),而非公平锁则没有这个限制,所以也就解释非公平锁得效率会比公平锁高。