这是一种处理阻塞关闭的线程安全方法吗?

时间:2014-05-17 09:58:34

标签: java multithreading interrupted-exception

线程打开资源,这是一个阻塞操作。如果并且一旦成功,线程就需要再次关闭它,这又一次阻塞但总是在有限的时间内成功。

可以使用一个标志(让它调用它hasResource),它不能以任何方式与其他线程同步,以指示该线程不希望被中断。根本不允许其他同步。

以下是处理此方案的安全方法吗?

@Override // we're subclassing Thread
public void run () {
    try {
        while (!interrupted ()) {
            blockingOpen ();
            // glitch possibility in this line
            hasResource = true;
            blockingClose ();
            hasResource = false;
        }
    }
    catch (final InterruptedException e) {
        interrupt ();
    }
}

特别是,这是否确保线程在拥有资源时不会被中断?

据我所知,只有一个错误机会窗口,就在Open之后和设置标志之前。但是,这似乎不会导致资源泄漏,而是意外忽略中断请求。是否有可能阻止这种情况?

2 个答案:

答案 0 :(得分:1)

原始代码实际上是正确的。设置bool标志不是问题,即使问题错误地表明它可能是。有两点需要考虑清楚:

首先,线本身不会导致错误。如果Open成功,将设置标志 - 始终。这里甚至不能合理地发生StackOverflow或OutOfMemory。

其次,如果在没有执行可中断代码(例如睡眠)的情况下调用interrupt(),则将设置interrupted标志。下次任何可中断代码开始执行时,将检查此标志,而不是运行代码,将抛出中断异常。

因此,原始代码确实按预期工作。

答案 1 :(得分:0)

  

可以使用一个标志(让我们称之为hasResource),它不能以任何方式与其他线程同步,以指示该线程不希望被中断。根本不允许其他同步。

不,不是。

  

这是否确保线程在拥有资源时不会被中断?

没有。 如果<{em> hasResourcevolatile 所有其他线程都知道hasResource 观察它,那么你已经禁止自己调用Thread.interrupt(),但你没有禁止 Java 这样做。

为什么你的应用程序线程会互相打断是另一个问题。从未在20年内使用过此功能。