【发布时间】:2018-11-07 18:39:45
【问题描述】:
我正在详细分析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
【问题讨论】:
-
这似乎是防御性编码。如果代码以原始开发人员未预料到的方式更改,它可能会失败。
-
Peter 所说的,但表单也暗示了机制:在
casBusy()中获取了“某种”锁,并且约定总是在 finally 块中释放锁(busy = 0in这个案例)。遵循约定,即使不是严格要求,也使代码(结构)更易于阅读和理解(至少对我而言)。
标签: java algorithm try-catch finally