[锁机制] 显式锁的分类
显式锁指代码级别的锁,由编码的程序员使用以达到高级程序语言自带锁不能提供的高级功能。如可重入、公平、可中断等。
1.可重入锁和不可重入锁
同一线程是否可以重复占有同一个锁对象。
可重入(递归)锁、不可重入锁。
例如,线程在外层函数抢占了锁A,在进入内层函数时可以再获得锁A对象,即为可重入锁。
2.悲观锁和乐观锁
进入临界区前,线程是否需要先锁住同步资源。
悲观锁:每次读写前都会将对象上锁。适用于写多于读的场景,高并发写时性能较高。
乐观锁:更新数据前判读数据是否被别人修改过,若违背修改过则进行更新。采用CAS或版本比较。
Java的Synchronized重量级锁是悲观锁,轻量级锁是乐观锁。
3.公平锁和非公平锁
不同线程间抢占锁的机会是否公平。
公平锁,则抢占的先后顺序一般为FIFO。
非公平锁则可能“插队”,如应当获取锁的下一个线程被唤醒之前,一个本来就活跃的线程可以抢先获得锁。
4.可中断锁和不可中断锁
正在抢占锁的线程,是否可以因为超时等原因中断抢占的阻塞等待。
5.共享锁和独占锁
根据锁是否可以被多个线程持有分类。
一般只读锁可以被共享。