自适应独占锁如何根据线程等待次数动态调整自旋次数?
- 内容介绍
- 文章标签
- 相关推荐
本文共计578个文字,预计阅读时间需要3分钟。

javaimport java.util.concurrent.locks.ReentrantLock;
/** * 自适应锁,默认具有自旋次数的自适应独占锁,能动态地根据等待线程的数量来决定是使用tryLock还是lock来获取锁。 * * 1. tryLock - 内部使用tryLock来获取锁 */
AdaptionLock.javaimport java.util.concurrent.locks.ReentrantLock; /** * 带默认自旋次数的自适应独占锁,能够动态的根据线程获取锁的等待次数来决定是使用tryLock还是lock来获取锁 * * 1.tryLock->内部使用的是CAS操作获取锁,是一次简单的判定。 * 在ReentrantLock源码中,其本身的lock()操作也会调用一次tryLock()来尝试获取锁, * 获取失败则将线程加入CLH等待队列,然后通过acquireQueued()来获取锁 * * 2.lock->内部会先通过一次tryLock()来尝试获取锁,若获取失败则将需获取锁的线程加入CLH等待队列,然后通过acquireQueued()获取锁 * 而acquireQueued()的作用就是逐步的去执行CLH队列的线程,如果当前线程获取到了锁,则返回; * 否则,当前线程进行休眠,直到唤醒并重新获取锁了才返回。
本文共计578个文字,预计阅读时间需要3分钟。

javaimport java.util.concurrent.locks.ReentrantLock;
/** * 自适应锁,默认具有自旋次数的自适应独占锁,能动态地根据等待线程的数量来决定是使用tryLock还是lock来获取锁。 * * 1. tryLock - 内部使用tryLock来获取锁 */
AdaptionLock.javaimport java.util.concurrent.locks.ReentrantLock; /** * 带默认自旋次数的自适应独占锁,能够动态的根据线程获取锁的等待次数来决定是使用tryLock还是lock来获取锁 * * 1.tryLock->内部使用的是CAS操作获取锁,是一次简单的判定。 * 在ReentrantLock源码中,其本身的lock()操作也会调用一次tryLock()来尝试获取锁, * 获取失败则将线程加入CLH等待队列,然后通过acquireQueued()来获取锁 * * 2.lock->内部会先通过一次tryLock()来尝试获取锁,若获取失败则将需获取锁的线程加入CLH等待队列,然后通过acquireQueued()获取锁 * 而acquireQueued()的作用就是逐步的去执行CLH队列的线程,如果当前线程获取到了锁,则返回; * 否则,当前线程进行休眠,直到唤醒并重新获取锁了才返回。

