可中断锁和不可中断锁
- 可中断锁:线程申请该锁之后,即便没有得到该锁,也可以进行其他逻辑处理。
ReentrantLock
就属于是可中断锁。 - 不可中断锁:一旦线程申请了锁,就只能等到拿到锁以后才能进行其他的逻辑处理。
synchronized
就属于是不可中断锁
可重入锁与不可重入锁
可重入锁:当线程获取某个锁后,还可以继续获取它,而不会发生死锁
不可重入锁:与可重入相反,获取锁后不能重复获取,否则会死锁(自己锁自己)
自旋锁和互斥锁
互斥锁:线程尝试获取一个已经被持有的互斥锁时,该线程会被挂起,直到锁被释放,操作系统才会唤醒该线程,将其放回运行队列。
自旋锁:线程尝试获取一个已经被持有的自旋锁时,它会而是原地自旋,不断检查锁的状态,直到锁变为可用。
互斥锁挂起再唤醒的过程会因为上下文切换而浪费资源,而自旋锁原地自旋的过程也会不断消费CPU资源
所以:锁很快就能被释放的场景下,使用自旋锁,反之则使用互斥锁