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方法成为线程安全的.
| 归档时间: |
|
| 查看次数: |
637 次 |
| 最近记录: |