JGF*_*FMK 2 java concurrenthashmap
我一直在查看以下代码(来自此处)'
/**
* Initializes table, using the size recorded in sizeCtl.
*/
private final Node<K,V>[] initTable() {
Node<K,V>[] tab; int sc;
while ((tab = table) == null || tab.length == 0) {
if ((sc = sizeCtl) < 0)
Thread.yield(); // lost initialization race; just spin
else if (U.compareAndSetInt(this, SIZECTL, sc, -1)) {
try {
if ((tab = table) == null || tab.length == 0) {
int n = (sc > 0) ? sc : DEFAULT_CAPACITY;
@SuppressWarnings("unchecked")
Node<K,V>[] nt = (Node<K,V>[])new Node<?,?>[n];
table = tab = nt;
sc = n - (n >>> 2);
}
} finally {
sizeCtl = sc;
}
break;
}
}
return tab;
}
Run Code Online (Sandbox Code Playgroud)
有人可以解释为什么需要 try 块吗?
未经检查的异常和错误作为一个概念而存在。如果您调用.put()ConcurrentHashMap,并且内存非常紧张,则该映射可能会尝试创建一个数组,并且该调用可能会失败并出现 OutOfMemoryError。代码仍将继续(也许在捕获此内容的 catch 块处),并且对该映射的引用仍然存在。如果发生这种情况之后,地图崩溃并完全失效,因为 sizeCtl 的值已损坏,那就有点糟糕了。
重点是finally 块,它恢复了sizeCtl值。这用于多种用途,值得注意的是包括管理哪个线程可以访问。如果没有,任何其他看跌期权都将永远旋转。
这个的相关性(例如,这里发生 throwable 的频率,与删除“try”和“finally”并以没有sizeCtl = sc;try/finally 的额外开销结束)很低,但如果它是相关的,这是非常相关的。
| 归档时间: |
|
| 查看次数: |
208 次 |
| 最近记录: |