锁的分类
可重入锁和不可重入锁
可重入锁:如果锁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中有互斥锁,也有共享锁