回答
如果任务的执行时间比锁的超时时间还长,这种情况会导致锁过早被释放了,从而会让其他线程在当前线程的任务完成之前获取到锁,这就会引发线程安全问题。为了解决这个问题,我们一般有如下几种解决方案:
- 续租机制【推荐方案】
最常见有效的方案是实现一个锁续租机制。也就是在任务执行期间,会定期更新锁的过期时间。确保锁在整个任务执行期间保持有效。Redisson 提供了 watch dog
机制(看门狗),该机制具备锁自动续期功能,用于避免分布式锁在业务处理过程中因执行时间过长而被提前释放。watch dog
会自动检测用户线程是否还活着,如果活着,它会在锁快要自动释放之前自动续期,直到用户线程完成工作。
- 使用更长的锁超时时间
我们预估一个任务的最长执行时间,然后将所的超时时间设置更长一点,已覆盖这个时间范围。但是这种方案有几个缺陷:绝大部分任务的执行时间都会比预估的最长超时时间短,如果某个线程中途崩溃了,导致锁无法正常释放,这就会降低系统的并发性。
- 检查任务状态
再获取锁后,检查任务的执行状态,如果仍然有任务在运行,则在那里等待。
- 任务拆分
我们可以将一个长时间执行的任务拆分为多个独立的较短的小任务,每个步骤都有自己独立的分布式锁,这样就可以减少锁定资源的时间,同时确保每个阶段都能在适当的时间内完成。