Thread.interrupt()中查询JavaDocs和Java SE 7方法的源代码,我发现了这一点:

public void interrupt() {
    if (this != Thread.currentThread())
        checkAccess();

    synchronized (blockerLock) {
        Interruptible b = blocker;
        if (b != null) {
            interrupt0();           // Just to set the interrupt flag
            b.interrupt(this);
            return;
        }
    }
    interrupt0(); //1, Outside of the synchronized block
}

//...

private native void interrupt0();

可以看出,在//1上的本地方法调用在同步块(synchronized block)之外。因此,如果不将对interrupt()方法的调用放入synchronized块中,是否安全?
Thread t;
//something else
t.interrupt(); //Not in a synchronized block

它是线程安全的吗?如果有多个线程尝试同时中断该线程怎么办?本地方法interrupt0会如何表现呢?

最佳答案

我会说是的...这是线程安全的。

原因:

  • 如果应用程序有必要在interrupt()块中调用synchronized,则规范(javadoc)会这样说,还说出要同步以获取线程安全所需的对象。实际上,javadoc对此一无所知。
  • 如果应用程序有必要在interrupt()块中调用synchronized,则Oracle Java并发性教程中将其称为on this page。没有。
  • 如果要使Thread调用具有线程安全性,必须对interrupt()对象进行外部同步,那么很难解释为什么该方法也要进行内部同步。 (如果需要的话,他们可以/将整个方法同步化。)

  • 以上证据(IMO)令人信服,尽管不是绝对证据。如果您想证明interrupt()是线程安全的,则可以通过对interrupt0()的 native 代码实现进行全面分析来获得它。我没有看过 native 代码,但是我希望interrupt0在内部是线程安全的,这足以使interrupt方法是线程安全的。

    10-02 06:43