我有一个名为X的全局变量(对象)。我也有两个不同的线程,分别称为ThreadA和ThreadB,它们同时使用X。
ThreadA加+1达100次,而ThreadB与2乘以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),但它仅决定输入时间。
最佳答案
这种功能不存在,这是有充分理由的。仅基于时间释放锁是天生的不安全,而与锁应该保护的内部状态无关。
尽管获取锁的超时是有意义的,但是在锁的持续时间内超时会带来比使用更多的麻烦。获取锁后,您可以做任何想做的事情,直到决定释放它为止。如果您遇到死锁(这种情况可能会从定时锁中获得一些使用),那么很不幸,但这可以通过修复设计而不是在锁上设置超时来解决。
因为您的代码只是一般的线程测试代码,所以我想您只是假设存在这样一种机制,但是如果您遇到需要此类内容的情况,则可能会以不同的方式进行编码。