如何设置超时锁定机制?

时间:2018-03-19 10:15:08

标签: 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),但它只决定进入时间。

2 个答案:

答案 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