ReentrantLock为可重入锁,底层是AQS实现的.
ReentrantLock有两种模式,一种是公平锁,一种是非公平锁
公平锁下等待线程入队后会严格按照队列顺序执行
非公平锁模式下等待线程入队列后有可能会出现插队情况
公平锁
第一步:获取状态的state的值
如果state = 0即代表锁没有被其他线程占用,执行第二步
如果state != 0则代表锁正在被其他线程占用,执行第三步
第二步:判断队列中是否有线程在排队等待
如果不存在则直接将锁的所有者设置成当前线程,且更新状态state.
如果存在就入队
第三步:判断锁的所有者是不是当前线程
如果是则更新状态state的值
如果不是,线程进入队列等待
非公平锁
获取状态的state的值
如果state=0即代表锁没有被其他线程占用,则设置当前锁的持有者为当前线程,该操作用CAS完成
如果不为0或者设置失败,代表锁被占用进行下一步
此时获取state的值
如果是,则给state + 1,获取锁
如果不是,则进入队列等待
如果是0,代表刚好线程释放了锁,此时将锁的持有者设为自己
如果不是0,则查看线程持有者是不是自己