我是否需要同步对中断方法的调用?

St.*_*rio 20 java multithreading interrupt

咨询的JavaDoc和的源代码Thread.interrupt()中的方法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();
Run Code Online (Sandbox Code Playgroud)

可以看出,本机方法调用位于//1同步块之外.那么,如果不将interrupt()方法调用到synchronized块中,是否安全?

Thread t;
//something else
t.interrupt(); //Not in a synchronized block
Run Code Online (Sandbox Code Playgroud)

它是线程安全的吗?如果超过1个线程试图同时中断它怎么办?interrupt0那么本机方法将如何表现?

Ste*_*n C 10

我会说是的......它是线程安全的.

原因:

  1. 如果是必要的应用程序调用interrupt()synchronized块,那么规范(Javadoc中)会这么说,也说什么反对你需要同步到获得线程安全的.事实上,javadoc对此一无所知.

  2. 如果应用程序需要interrupt()synchronized块中调用,那么Oracle Java Tutorial on Concurrency将在此页面上提及它.它没有.

  3. 如果Thread需要在对象上进行外部同步以使interrupt()调用成为线程安全的,那么很难解释为什么该方法也在进行内部同步.(如果有必要,他们可以/将会使整个方法同步.)

上述证据(IMO)令人信服,但不是绝对的证据.如果您希望证明interrupt()是线程安全的,那么您可以通过对本机代码实现的全面分析来获得它interrupt0().我没有看过本机代码,但我希望这interrupt0是内部线程安全的,这足以使该interrupt方法成为线程安全的.