在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
方法是线程安全的。