在Java的单机锁中,总是绕不开ReentrantLock,在JDK源码中到处可见,足以证明其重要性。
接下来我们一起来揭开它的神秘面纱,其原理是基于AQS进行实现的,先简单介绍它的几个核心方法。
1、lock():顾名思义就是加锁,其包含公平锁和非公平锁(默认)两种,抢不到锁线程会一直处于wait状态,是一种悲观锁。
2、tryLock(): 尝试加锁,失败或成功都直接返回,不会被阻塞
3、tryLock(long TimeUnit): 也是尝试加锁,但是多了一个超时时间,先尝试加锁,失败后不会立即返回,而是进入同步队列轮询抢锁,到了超时时间才会返回。
4、unlock():释放锁
下面详细讲解lock方法和unlock方法
lock方法:包括抢锁环节和重试环节,基于AQS实现,通过控制设置一个标志位state的值,来实现加锁和锁的释放过程,其中全程通过cas的方式来保证并发安全。
unlock方法:为啥这个方法不用cas呢,从源码上我们可以看到释放锁之前会先校验是不是该线程是不是加锁的线程,不是则会抛出异常,通过这种方式保证了只有一个线程能修改state值,从而保证线程安全。话不多说,详细流程请看如下流程图。