gpt4 book ai didi

java - 我需要同步对中断方法的调用吗?

转载 作者:IT老高 更新时间:2023-10-28 20:54:00 25 4
gpt4 key购买 nike

查阅Java SE 7Thread.interrupt()方法的JavaDocs和源代码我发现了这个:

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 处的 native 方法调用在同步块(synchronized block)之外。那么,如果不将 interrupt() 方法的调用放入 synchronized block 中是否安全?

Thread t;
//something else
t.interrupt(); //Not in a synchronized block

它是线程安全的吗?如果超过 1 个线程会同时尝试中断它怎么办?那么原生方法 interrupt0 会如何表现呢?

最佳答案

我会说是的……它是线程安全的。

原因:

  1. 如果应用程序需要在 synchronized block 中调用 interrupt(),那么规范(javadoc)会这样说,并且说出您需要同步哪个对象以获得线程安全。事实上,javadoc 对此只字未提。

  2. 如果应用程序需要在 synchronized block 中调用 interrupt(),那么 Oracle Java 并发教程会提到它on this page .没有。

  3. 如果 Thread 对象上的外部同步对于使 interrupt() 调用线程安全是必要的,那么很难解释为什么该方法是也做内部同步。 (如果有必要,他们可以/应该使整个方法同步。)

上述证据 (IMO) 令人信服,但不是绝对证据。如果你想证明 interrupt() 是线程安全的,你可以通过彻底分析 interrupt0() 的本地代码实现来获得它。我没有看过 native 代码,但我希望 interrupt0 在内部是线程安全的,这足以使 interrupt 方法成为线程安全的。

关于java - 我需要同步对中断方法的调用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32841834/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com