我有一个名为 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/