【发布时间】:2016-02-05 23:51:11
【问题描述】:
我目前正在开发一个应用程序,该应用程序在某些测试用例中会进入无限循环,但如果我重做相同的测试,它会运行良好。为了防止它发生,我使用辅助线程来监控自任务开始以来经过的时间,但我目前没有使用同步块,因为我不知道如何使用。
这是一个例子:
public class ThreadHarvest {
private static final ReentrantLock lock = new ReentrantLock();
private static boolean safe;
public static void main(String[] args) throws InterruptedException
{
Thread task = new Thread(() ->{
lock.lock();
safe = false;
for (long i = 10000000L; i > 0L; --i)
System.out.println(i);
safe = true;
lock.unlock();
System.out.println("Safe ended!");
});
task.start();
while (lock.isLocked() == false);
lock.tryLock(5, TimeUnit.SECONDS);
if (!safe)
{
task.stop();
System.out.println("Force ended!");
}
}
}
另外,还有一个特定的区域可以保证是安全的,就是在锁被释放之后。而且我也知道 stop 方法已被弃用,所以如果你碰巧有一些好主意来减少出错的可能性,我将非常感谢:D
【问题讨论】:
-
注意:由于
boolean safe不是易失性的,您的主线程可能看不到这种变化。 -
同步不是对无限循环的防御,但它是一种将它们转换为死锁的可能方法。你的问题没有意义。
-
@PeterLawrey iirc,
ReentrantLock还要确保更改可见。 (你可以用谷歌搜索java reentrantlock memory barrier)。 OP 使用它的方式似乎工作正常(需要更多检查:P) -
OP:afaik,Java 中没有适当的方法来“强制”结束线程。您可能想通过 Google 搜索
Java thread interrupt来搜索如何处理类似情况。简而言之,你的线程应该被重写以准备中断,你的主线程中断相应的线程以试图阻止它们继续工作。
标签: java parallel-processing synchronized locks