gpt4 book ai didi

java - LongAdder : How can the try block fail?

转载 作者:行者123 更新时间:2023-12-01 11:55:44 25 4
gpt4 key购买 nike

我正在分析 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;
}

问题:这怎么可能 try块失败?

注意数组访问
rs[j = (m - 1) & h] 

不应该抛出 IndexOutOfBoundsException因为按位与运算的结果总是小于或等于其整数参数的最小值,因此 0 <= j <= m-1 在数组的边界内。

最佳答案

这很像 ReentrantLock 使用的模式jdk 代码本身的其他地方。这里的“模式”是你应该总是释放锁,即使发生了异常,所以通常代码写成:

Lock someLock...

try {
// use someLock
} finally {
someLock.unlock();
}

cellsBusy (它从 busy 重命名)实际上是一个忙自旋锁,这里的模式有点相同。像这样:
cellsBusy = 0;

实际上是“释放锁”。所以这并不是真正的失败,因为它是关于显式释放锁。我发现这更容易阅读和推理代码。

关于java - LongAdder : How can the try block fail?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53195759/

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