当前位置: 首页 > 知识库问答 >
问题:

RLock#lock(长租赁时间,时间单位)租赁时间低于执行时间

汤昊
2023-03-14

代码:

public void lock() {
    RLock lock = redissonClient.getLock("lock");
    lock.lock(1, TimeUnit.SECONDS); // or use lock.lock()
    doSomething();
    lock.unlock(); // if necessary
}

如果doSomething()花费时间超过1s(类似于网络的原因),那么另一个线程可以获得锁,但这会导致一些问题(例如超卖)。如果使用锁。lock(),当此客户端脱机时,它将永远不会解锁锁,其他客户端无法获得锁。如何解决或平衡这个问题?

共有1个答案

蓬长恨
2023-03-14

如果使用锁。lock(),当此客户端脱机时,它将永远不会解锁锁,其他客户端无法获得锁。

当您使用lock#lock()时,相应的密钥上会设置一个过期时间(默认为30秒,请参见org.redisson.config.Config#lockWatchdogTimeout),并且会有一个始终负责自动延长(延长相应密钥的过期时间)的watchdog(看门狗实际上是一个计时器任务)。

因此,如果您的客户端突然断开连接,那么锁将在一段时间后释放(也就是说,相应的密钥已过期,因为watchdog也会挂断您的客户端)。因此,如果使用lock#lock(),就不必担心锁永远不会被释放的问题。

 类似资料:
  • 背景:当你从中介公司租车时,钥匙圈上有几条信息:车牌、品牌和年份,通常还有一个特殊的代码。该代码可用于公司计算机内的某些数据处理。本实验室将练习从车牌中确定特殊的租车代码。 工作分配: 以下步骤序列将用于将示例车牌转换为汽车租赁代码。 a、 车牌由3个字母后跟一个空格,再后跟一个3位整数组成。例如,CPR 607。 b、 将3个字母的ASCII值相加,67 80 82=229。 c.将字母之和加到

  • 我目前使用的是mysql 我有两个名为person和zim_list_id的表,这两个表都有超过200万行

  • 我无法使用截击库。我不想无限期地等待请求,所以我不想设置超时。但它不起作用。我在其他地方也有同样的东西(我使用RequestFuture而不是RequestFuture),它运行良好,但在这里我无法将其设置为工作状态。 如果你能提供任何帮助,那就太棒了!谢谢

  • 我正在做下面的家庭作业(我对Java还是个新手……),我对写LuxuryCarRental有一些疑问……我不确定我在CarRentall的工作是否正确。我还没有到UseCarRental。 创建一个名为 CarRental 的类,其中包含以下字段:租用者姓名、邮政编码、汽车大小、租车费、天数出租和总计出租费。 该类包含一个构造函数,它需要除总费用以外的所有租金数据,总费用根据汽车的大小计算:经济型

  • 我正在使用ExecutorService.invokeAll(Callable, timeout, TimeUnit)方法 在提交给ExecutorService的每个Callable中,我都有一个future.get() 未来会发生什么。即使executorService已超时,get()仍将在后台运行? 我必须指定未来的超时时间吗。获取(timeout,TimeUnit)并抛出TimeoutE

  • 我正在尝试一些方法和一个动作/“命令”的响应,可以每周使用一次(垃圾邮件预防)。我唯一的问题是如何将我的java时间设置为一周。这就是我所拥有的: 方法: 我想把“星期”时间改成displayTime=System。currentTimeMillis()(1000*60*60);。我相信(1000*60*60)是24小时,对吗?这是我唯一的问题。解决此问题后,用户每周只能使用该命令一次。命令就在这