java - Lock机制如何设置超时?

标签 java multithreading locking

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

ThreadA 加 1 100 次,ThreadB 乘 2 两次。

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

1
2
3
6
7
14.. etc

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

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

机制。

现在我的代码可以工作了

1
2
3
4
...
100
200
400

但是我想添加超时,所以如果 ThreadA 需要超过 2 秒,我想释放锁以便 ThreadB 可以操作它。

想看类似的东西

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

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

最佳答案

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

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

因为你的代码只是一般的线程测试代码,我猜你只是假设存在这样的机制,但是如果你能想到你需要类似的东西的情况,它可能会被编码成不同的方式。

关于java - Lock机制如何设置超时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49360418/

相关文章:

java - 如何在eclipse中使用xml序列化的xstream

ios - 总是预防性地将 UI 更改包装到主线程中?

java - 当一个线程获取锁时,其他线程是否可以调用其他方法?

Java 和 JavaScript 直接通信

java - 为什么是 nextLine() 而不是 nextString() ?

java - 为线程类设置超时

mysql - symfony2主义2 : in which cases do we need to lock a database table/row?

python - 列达到特定值后立即删除行

java - 使用java更新mysql中的数据库

c++ - 工作线程如何与主 UI 线程通信?