六、锁的分类

120 阅读2分钟

锁的分类

可重入锁和不可重入锁

可重入锁:如果锁A是可重入锁,那么线程X在获取到锁A,还没有释放的时候,可以再进行获取

不可重入锁:与可重入锁相反,线程只能获取不可重入锁一次,想再次获取,需要等自己释放锁

synchronized、ReentrantLock、ReentrantReadWriteLock都是可重入锁

线程池中有个内部类worker,其中实现了不可重入锁

乐观锁和悲观锁

乐观锁:线程在没有获取到锁资源的情况下,不会被挂起

悲观锁:线程在没有获取到锁资源的情况下,会被挂起,线程被挂起,是需要cpu从用户态切换到内核态的,比 较消耗资源

用户态:用户态指令是JVM可以执行的

内核态:内核态指令是操作系统指令,JVM不能执行,操作系统才能执行

synchronized、ReentrantLock、ReentrantReadWriteLock都是悲观锁

CAS是乐观锁

公平锁和非公平锁

公平锁:锁资源被线程A占用,线程B来申请,发现锁被占用,线程B进入队列中。线程C来了,发现队列中有线程B,直接排到B的后面,也不尝试申请下锁资源

非公平锁:锁资源被线程A占用,线程B来申请,发现锁被占用,线程B进入队列中。线程C来了,先尝试申请锁资源,申请失败,再排到B的后面

synchronized是非公平锁,ReentrantLock和ReentrantReadWriteLock可以是公平锁,也可以是非公平锁

互斥锁和共享锁

互斥锁:同一时刻,只能有一个线程持有锁资源

共享锁:同一时刻,可以有多个线程持有锁资源

synchronized、ReentrantLock是互斥锁

ReentrantReadWriteLock中有互斥锁,也有共享锁