【发布时间】:2018-03-19 10:15:08
【问题描述】:
我有一个名为 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) 但它只决定输入时间。
【问题讨论】:
-
这在
lock级别上毫无意义。如果你只是在线程仍在使用它的时候释放了锁,你会得到不可预知的行为和数据竞争错误。您要做的是限制线程的允许运行时间,然后 interrupt 线程如果花费的时间太长 - 此时它应该停止工作并正确释放锁。或者查看 ExecutorService / Futures,它们可以在一定程度上帮助您实现这一目标。
标签: java multithreading locking