我有一个名为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),但它只决定进入时间。
答案 0 :(得分:3)
这种功能并不存在且有充分理由。单独根据时间释放锁定本质上是不安全的,而不考虑锁应该保护的内部状态。
虽然获取锁定的超时是有意义的,但在锁定期间超时会导致比使用时更多的麻烦。一旦你获得锁定,你可以做任何你想做的事情,直到你决定释放它。如果你遇到了僵局(这种情况可以从定时锁定中获得一些用处),这是不幸的,但是通过修复你的设计而不是设置锁定超时来解决它。
由于你的代码只是通用线程测试代码,我猜你只是假设存在这样一种机制,但如果你能想出一个你需要这样的东西的情况,它可能会被编码为另一种方式。
答案 1 :(得分:0)
Java提供了Condition类来实现类似的功能。 您使用条件类的await()方法,时间为2秒,否则调用lock.unlock()。虽然记住,由于线程的固有特性,等待时间也可能大于2秒。此外,这将容易出错,您需要注意不同的情况。请参阅文档:https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/Condition.html