基于线程对同一把锁的获取情况分类
- 可重入锁
同一个线程可以多次获取锁
每次获取锁,锁的计数器加1,每次释放锁锁的计数器减1
锁的计数器归零,锁完全释放
Java中提供的synchronized,ReentrantLock,ReentrantReadWriteLock都是可重入锁。
不可重入锁
同一个线程不可以多次获取锁,必须等待锁释放才能再次获取
基于对共享资源的访问策略
- 乐观锁
当线程获取不到资源,让cpu再次调用重新获取锁资源
Atomic原子性类中,就是基于CAS乐观锁实现的。
- 悲观锁
当前线程获取不到锁资源,线程会被挂起进入(BLOCKED、WATING)状态,于此同时线程的挂起会涉及用户态与内核态的切换,消耗资源
用户态:JVM自己执行指令,不需要CPU调度
内核态:JVM不能自己执行,需要操作系统调度
Java中提供的synchronized,ReentrantLock,ReentrantReadWriteLock都是悲观锁。
根据线程获取锁的先后顺序
- 公平锁
线程获取锁的顺序和你来的顺序一致,先到先得。
- 非公平锁
线程获取锁的时候可以使用竞争的方式,竞争失败也排队获取
Java中提供的synchronized只能是非公平锁。
Java中提供的ReentrantLock,ReentrantReadWriteLock可以实现公平锁和非公平锁
根据锁被线程资源占有的数量
- 互斥锁
同一时刻,只有一个线程可以拥有这把锁
Java中提供的synchronized、ReentrantLock是互斥锁。
一般上写的业务场景
- 共享锁
同一个时刻,一把锁可以被多个线程资源共享
一般读的业务场景
Java中提供的ReentrantReadWriteLock,有互斥锁也有共享锁。
如果您觉得我所提供的信息对您有帮助,欢迎您点赞、收藏和评论。如果您想要更深入的交流,您可以添加我的微信号,或者关注我的微信公众号。您的支持和鼓励是我持续写作的动力,我期待与您互动并提供更多有价值的信息。