在Java线程中锁定对象一段时间

时间:2010-11-09 10:14:18

标签: java multithreading

我需要实现以下方案

  • ThreadN获取锁
  • ThreadM尝试获取锁定并等待
  • ThreadX(监视器)发现ThreadN持有锁太长时间并释放锁
  • ThreadM获取锁定并继续

ThreadN的命运并不重要。

我应该使用哪些类(来自java.util.concurrent?)?

2 个答案:

答案 0 :(得分:2)

我认为您可以基于Semaphore实现此功能,但您必须通过设置获取锁定时的时间戳,定期检查并中断持有锁定的线程来实现监视功能,如果它是举行太久了。

LockSupport课程看起来也有帮助。

答案 1 :(得分:0)

Afaik你不能。

在Java中锁定是合作的 - 如果线程获取对象的锁定,则无法强制它从另一个线程释放锁定。

所有java.util.concurrent类都基于Java锁定功能(synchronize / wait / notify)构建,因此它们没有这样的功能。

你应该做的是编写ThreadN,以便偶尔释放一个锁。您可以使用基本锁定构造(synchronize / wait / notify)通过添加一个原子变量(boolean)来表明另一个线程需要锁定。然后ThreadN将释放锁。

或者使用更高级别的java.util.concurrent类,例如Lock。