当前位置: 首页 > 面试题库 >

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

东郭鸿福
2023-03-14
问题内容

咨询JavaDocs和该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();

可以看出,在处的本机方法调用在//1同步块之外。因此,如果不将对interrupt()方法的调用放入synchronized块中,是否安全?

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

它是线程安全的吗?如果有多个线程尝试同时中断它怎么办?这样,本机方法将如何interrupt0表现?


问题答案:

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

原因:

  1. 如果应用程序有必要interrupt()在一个synchronized块中调用,那么规范(javadoc)会这样说,并且还说出需要同步到哪个对象以获得线程安全。实际上,javadoc对此一无所知。

  2. 如果应用程序有必要interrupt()在一个synchronized块中调用,那么Oracle Java并发性教程将在此页面上提及。没有。

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

以上证据(IMO)令人信服,尽管不是绝对证据。如果您想要证明interrupt()是线程安全的,则可以通过对的本机代码实现进行全面分析来获得它interrupt0()。我没有看过本机代码,但是我希望它interrupt0在内部是线程安全的,并且足以使该interrupt方法成为线程安全的。



 类似资料:
  • 例如,在下面的代码中,最后一个方法M2Async是同步的,没有Async/await,否则在await之后需要调用M3Async,调用图将继续? 为了清晰起见(简而言之,来自C#): > 同步操作在返回调用方之前完成其工作。 异步操作在返回调用方后完成(大部分或全部)工作。 public void Main(){Task Task=M1Async();//some work int i=Task.

  • 同步调用异步方法最安全的方法是什么?

  • 我正试图从同步方法运行异步方法。但是我不能等待异步方法,因为我在同步方法中。我一定不理解TPL,因为这是我第一次使用它。 每个方法都需要前一个方法来完成,因为第一个方法的数据用于第二个方法。 Await运算符只能在异步方法中使用。考虑用'async'修饰符标记此方法,并将其返回类型更改为'task' 但是,如果我使用async修饰符,这将是一个异步操作。因此,如果我对的调用没有使用await运算符

  • 为什么下面的代码不能保证多个线程之间total_home数字的唯一性,即使逻辑处于同步块中。 } } } 这是一个程序示例。试着运行5-10次,你会发现total_home的值并不是每次都是唯一的。

  • 问题内容: 我实际上何时需要调用此方法Runtime.getRuntime()。addShutdownHook()以及何时或为何需要关闭应用程序。任何人都可以通过举例说明一下。 谢谢 问题答案: 据我所知,我将在下面进行解释。您可以搜索它并找到很多信息。 将注册一些在程序终止时要执行的动作。您启动的程序以两种方式结束: 主线程(根)结束其运行上下文; 该程序遇到一些意外情况,因此无法继续进行。 如