Redisson实现了一整套JDK中ReentrantLock的功能,这里对比一下实现的差异和核心的思想。
unfair模式的带超时时间的tryLock(超时时间)
ReentrantLock
这里上来会直接先试下能不能try成功,如果不成功,进入等待并开始竞争等逻辑。
整个锁的核心是通过LockSupport的park方法来实现的,这是调用底层UNSAFE的park方法来实现的。如果在被等待获取的锁释放的时候,该线程会重新被唤醒,然后和其它线程一起竞争,如果没有竞争成功,那么继续park,循环往复,直到获取到锁或者等待超时(这里park的时间是当前要获取锁的线程等待获取锁的剩余时间,当前线程要么因为锁释放被唤醒,要么等到超时)。
这里有个小细节是,如果剩余的等待时间小于spinForTimeoutThreshold这个值,那么就不会再park然后等待唤醒了。这是为了防止park然后唤醒这种线程