乐观锁与悲观锁
- 乐观锁:操作数据不会上锁,更新数据会判断在此期间是否有其他线程修改数据
- 悲观锁:操作数据就会上锁,其他拿不到锁的线程都会阻塞
使用场景:
乐观锁适用于读多写少的场景,可以使用版本号机制、CAS算法实现
java中synchronized、ReentrantLock就是悲观锁,适用于读少写多的场景
独占锁和共享锁
- 独占锁:同时只能被一个线程所持有,synchronized和Lock就是独占锁
- 共享锁:可被多线程持有,一个线程加上共享锁,其他线程也只有对数据加共享锁,只能读不能写
互斥锁和读写锁
- 互斥锁:独占锁的一种常规实现,具有唯一性和排他性
- 读写锁:共享锁的一种具体实现,读写锁管理一组锁,一个是读读,一个是写锁;写锁优先级高于读锁,写锁是独占的,写锁是共享的,因此读写锁并发度高于互斥锁
公平锁和非公平锁
- 公平锁:线程按照申请锁的循序来获取锁
- 非公平锁:不是按顺序获取(可能存在某一线程一直得不到锁),synchronized关键字是非公平,ReentrantLock默认非公平
可重入锁(递归锁)
统一线程在外层方法获取了锁,进入内层会自动获取锁,synchronized和ReentrantLock是可重入锁,可重入锁可以一定程度避免死锁
自旋锁
线程没有获取锁的时候不被挂起,而是执行忙循环,目的是减少线程被挂起的几率,但另一线程长时间占用锁,线程自旋之后还是会挂起,因此,自旋锁不适用于所占用时间长的场景
分段锁
不是具体的锁,是一种锁的设计,目的细化锁的粒度,CurrentHashMap 底层就用了分段锁,使用Segment,因此可以并发使用
网友评论