如何将超时设置为锁定机制



我有一个名为X的全局变量(对象(。此外,我有两个不同的线程,名为ThreadA和ThreadB,它们同时使用X。

线程 A 加 +1 表示 100 次,线程 B 乘以 2 表示两次。

当我同时启动它们时,会发生并发性,我看到了一些东西

1
2
3
6
7
14.. etc

我已经通过添加解决了这个问题

ReentrantLock  lock = new ReentrantLock();
lock.lock();
..
lock.unlock();

机制。

现在我的代码可以工作了

1
2
3
4
...
100
200
400

但是我想添加超时,所以如果线程 A 花费超过 2 秒,想要释放锁定,以便线程 B 可以操纵它。

想看到类似的东西

1
(wait 100ms)
2
(wait 100ms)
3
...
20
400
800
801
( wait 100ms)
802
...

我已经尝试过trylock(2000,TimeUnit.MILLISECONDS(,但它只决定输入时间。

这种功能不存在,这是有充分理由的。仅根据时间释放锁本质上是不安全的,而不考虑锁应该保护的内部状态。

虽然获取锁的超时是有意义的,但在锁的持续时间内超时会导致比使用更多的麻烦。一旦你拿到了锁,你可以做任何你想做的事情,直到你决定释放它。如果您遇到死锁(这种情况可能会从定时锁中获得一些用处(,这很不幸,但可以通过修复您的设计而不是在锁上设置超时来解决。

由于您的代码只是通用的线程测试代码,我猜您只是假设存在这样的机制,但是如果您可以提出需要类似内容的情况,则可能会以不同的方式对其进行编码。

Java提供了Condition class来实现类似的功能。您使用条件类的 await(( 方法,时间为 2 秒,否则调用 lock.unlock((。但请记住,由于线程的固有性质,等待时间也可能大于 2 秒。此外,这将容易出错,您需要小心不同的情况。请参阅 docs:https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/Condition.html

最新更新