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
我会说是的......它是线程安全的.
原因:
如果是必要的应用程序调用interrupt()
的synchronized
块,那么规范(Javadoc中)会这么说,也说什么反对你需要同步到获得线程安全的.事实上,javadoc对此一无所知.
如果应用程序需要interrupt()
在synchronized
块中调用,那么Oracle Java Tutorial on Concurrency将在此页面上提及它.它没有.
如果Thread
需要在对象上进行外部同步以使interrupt()
调用成为线程安全的,那么很难解释为什么该方法也在进行内部同步.(如果有必要,他们可以/将会使整个方法同步.)
上述证据(IMO)令人信服,但不是绝对的证据.如果您希望证明interrupt()
是线程安全的,那么您可以通过对本机代码实现的全面分析来获得它interrupt0()
.我没有看过本机代码,但我希望这interrupt0
是内部线程安全的,这足以使该interrupt
方法成为线程安全的.