咨询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
表现?
我会说是的…这是线程安全的。
原因:
如果应用程序有必要interrupt()
在一个synchronized
块中调用,那么规范(javadoc)会这样说,并且还说出需要同步到哪个对象以获得线程安全。实际上,javadoc对此一无所知。
如果应用程序有必要interrupt()
在一个synchronized
块中调用,那么Oracle Java并发性教程将在此页面上提及。没有。
如果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()以及何时或为何需要关闭应用程序。任何人都可以通过举例说明一下。 谢谢 问题答案: 据我所知,我将在下面进行解释。您可以搜索它并找到很多信息。 将注册一些在程序终止时要执行的动作。您启动的程序以两种方式结束: 主线程(根)结束其运行上下文; 该程序遇到一些意外情况,因此无法继续进行。 如