gpt4 book ai didi

java - 最后返回 "happen after"吗?

转载 作者:IT老高 更新时间:2023-10-28 21:08:31 26 4
gpt4 key购买 nike

我试图说服自己 finally 子句中采取的操作发生在函数返回之前(在内存一致性意义上)。来自 JVM specification ,很明显,在一个线程中,程序顺序应该驱动 happen before 关系——如果 a 在程序顺序中发生 b然后 a 发生在 b之前。

但是,我没有看到任何明确说明 finally 发生在 返回之前的内容,是吗?或者,编译器是否可以通过某种方式重新排序 finally 子句,因为它只是记录日志。

激励示例:我有一个线程从数据库中获取对象并将它们放入 ArrayBlockingQueue,而另一个线程正在将它们取出。我有一些 try- finally block 用于事件计时,我看到了返回 before 日志语句

的影响之后

线程 1:

public Batch fetch() {
try {
log("fetch()+");
return queryDatabase();
}
finally {
log("fetch()-");
}
...
workQueue.put(fetch());

线程 2:

log("take()+");
Batch b = workQueue.take();
log("take()-");

令我惊讶的是,它以意想不到的顺序打印出来。虽然是的,不同线程中的日志记录语句可能会出现乱序,但至少存在 20 毫秒的时间差。

124 ms : take()+
224 ms : fetch()+
244 ms : take()-
254 ms : fetch()-

请注意,这与 does finally trump return 的问题并不完全相同。 .我不是在问会返回什么,而是在问内存一致性和执行顺序。

最佳答案

首先调用queryDatabase()。然后是finally block 。然后控制离开函数(即return)。

关于java - 最后返回 "happen after"吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5708834/

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