Reentrantlock 简介及其使用场景

1、Reentrantlock 是并发包中一个可重入的锁,是基于AQS(AbstractQueuedSynchronized)实现的,它有公平锁和不公平锁两种实现方式。

2、Reentranlock 中有一个内部抽象类 Sync 继承自 AbstractQueuedSynchronized ,主要是它来实现锁的功能, Sync 在 ReentrantLock 中有两种实现类:NonfairSync、FairSync,正好对应了ReentrantLock的非公平锁、公平锁两大类型。Reentranlock 默认实现为非公平锁,在高竞争的条件下有更好的性能。

ReentrantLock的使用场景:

1、发现该操作已经在执行中则不再执行

用在定时任务时,如果任务执行时间可能超过下次计划执行时间,确保该任务只有一个正在执行,忽略重复触发。

2、如果该操作已经在执行,则等待一个个执行(同步执行,与synchronized类似)。

3、如果该操作已经在执行,则尝试等待一段时间,超时则放弃执行
这种其实属于场景2的改进,等待获得锁的操作有一个时间的限制,如果超时则放弃执行,用来防止由于资源处理不当长时间占用导致死锁情况。

场景4:如果发现该操作已经在执行,等待执行,这时可中断正在进行的操作立刻释放锁继续下一操作。
synchronized 与 Lock 在默认情况下是不会响应中断(interrupt)操作,会继续执行完。Reentranlock中的 lockInterruptibly() 方法提供了可中断锁来解决此问题。(场景2的另一种改进,没有超时,只能等待中断或执行完毕)。

猜你喜欢

转载自blog.csdn.net/weixin_41163113/article/details/85937839