相关疑难解决方法(0)

finally块总是运行吗?

是否有任何条件最终可能无法在java中运行?谢谢.

java finally

110
推荐指数
8
解决办法
7万
查看次数

最后阻止和线程暂停

我注意到在Java中,如果当前线程在try-block中暂停,则相应的finally块不会被执行,例如

Semaphore lock = new Semaphore(0);

try {

    lock.acquire();

} finally {

// do something

}
Run Code Online (Sandbox Code Playgroud)

这种观察可以推广到线程的暂停,即Oracle文档说它只能用于绕过return,break并且continue

Oracle doc.说:

但最终不仅仅是异常处理有用 - 它允许程序员避免因返回,继续或中断而意外绕过清理代码.

java multithreading finally

7
推荐指数
1
解决办法
157
查看次数

当try或catch块被中断时,finally块何时不执行

try或catch块被中断时finally块是什么时候不执行的?doc说"如果执行try或catch代码的线程被中断或终止,即使整个应用程序继续执行,finally块也可能无法执行".有人能举例说明这种情况吗?

java finally

5
推荐指数
2
解决办法
3万
查看次数

当线程被中断/终止时,finally 块可能不会被执行吗?

Java 教程中它说try { ... } finally { ... }

注意:如果在执行 try 或 catch 代码时 JVM 退出,则finally 块可能不会执行。同样,如果执行 try 或 catch 代码的线程被中断或终止,则即使应用程序整体继续运行,finally 块也可能不会执行。

线程是否可以被中断杀死我认为这是不可能的?),这样当运行该线程的 JVM没有退出/杀死时,该finally块就不会被执行?(我很困惑,因为上面的引文对此非常明确,没有太大的误解空间。)

编辑:将问题分解为其核心意图。

java multithreading exit

5
推荐指数
1
解决办法
3327
查看次数

LongAdder:try 块怎么会失败?

我正在LongAdder详细分析算法。LongAdder扩展类Striped64,在该类中,基本方法是retryUpdate. 以下代码取自该方法;在链接的源代码中,它占据了第 212-222 行:

try {  // Recheck under lock
  Cell[] rs; int m, j;
  if ( (rs = cells) != null &&
       (m = rs.length) > 0  &&
       rs[j = (m - 1) & h] == null) {
     rs[j] = r;
     created = true;
   }
} finally {
  busy = 0;
}
Run Code Online (Sandbox Code Playgroud)

问题:这个try块怎么会失败?

注意数组访问

rs[j = (m - 1) & h] 
Run Code Online (Sandbox Code Playgroud)

不应该抛出 anIndexOutOfBoundsException因为按位与运算的结果总是小于或等于其整数参数的最小值,因此 0 <= j …

java algorithm finally try-catch

5
推荐指数
1
解决办法
119
查看次数

标签 统计

java ×5

finally ×4

multithreading ×2

algorithm ×1

exit ×1

try-catch ×1