使用synchronized块来防止无限循环

时间:2016-02-05 23:51:12

标签: java parallel-processing synchronized locks

我正在开发一个应用程序,在某些测试用例中,进行无限循环,但如果我重做相同的测试,它会很顺利。为了防止它,我使用辅助线程来监视自任务开始以来经过的时间,但我目前没有使用同步块,因为我不知道如何。

以下是一个例子:

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!");
        }
    }
}

此外,还有一个特定的区域可以保证安全,就在释放锁定之后。而且我也知道停止方法已被弃用,所以如果你碰巧有一些好的想法让它不那么容易出错,我会非常感激:D

1 个答案:

答案 0 :(得分:0)

我不太了解您的问题,但这里有一些关于您的代码的一般性评论。

  • 你永远不应该有这样的旋转循环。我添加了Thread.sleep(10);或其他内容。
  • 使用锁定,您应始终将解锁置于lock; try { } finally { unlock; }。然后你知道你的锁将被解锁,即使它会引发异常。
  • 如果您要访问两个不同线程中的字段,则必须以某种方式保护它。您可以AtomicBoolean使用safe或将其标记为volatile boolean,否则主线程可能看不到任何更改。无法保证与isLocked()tryLock()进行内存同步。
  • 如果只是尝试执行task.join(5, TimeUnit.SECONDS)然后测试if (task.isAlive()) { killItWithFire(); },而不是锁定和安全。
  

我目前正在开发一款应用程序,在某些测试用例中,会进行无限循环,

在我看来,你应该集中精力解决这个问题。 thread.stop()是一个真正的黑客。