- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
因为我正在阅读 java8 中 concurrentHashMap 的源代码,我对 sizeCtl
变量有点困惑,它说
When negative, the table is being initialized or resized: -1 for initialization, else -(1 + the number of active resizing threads)
但在源代码中,它会在尝试调整 ConcurrentHashMap
大小时使用 U.compareAndSetInt(this, SIZECTL, sc, sc + 1)
并使用 U.compareAndSetInt(this, SIZECTL, sc = sizeCtl, sc - 1)
完成运算后。
这些操作让我很困惑,例如,如果有 2 个线程同时调整 map 大小,那么 sizeCtl
就是 -3
,但是,当一个new thread try to help resize, sizeCtl
根据上面评论的描述应该是-4
,但是好像是-2
根据代码 U.compareAndSetInt(this, SIZECTL, sc, sc + 1)
。
final Node<K,V>[] helpTransfer(Node<K,V>[] tab, Node<K,V> f) {
Node<K,V>[] nextTab; int sc;
if (tab != null && (f instanceof ForwardingNode) &&
(nextTab = ((ForwardingNode<K,V>)f).nextTable) != null) {
int rs = resizeStamp(tab.length);
while (nextTab == nextTable && table == tab &&
(sc = sizeCtl) < 0) {
if ((sc >>> RESIZE_STAMP_SHIFT) != rs || sc == rs + 1 ||
sc == rs + MAX_RESIZERS || transferIndex <= 0)
break;
if (U.compareAndSwapInt(this, SIZECTL, sc, sc + 1)) {
transfer(tab, nextTab);
break;
}
}
return nextTab;
}
return table;
}
最佳答案
我以为它说错了。
When negative, the table is being initialized or resized: -1 for initialization, else -(1 + the number of active resizing threads)
自第一个进入函数的线程transfer
套sizeCtl
至 (resizeStamp(tab.length) << RESIZE_STAMP_SHIFT) + 2
.这是一个负值,它的绝对值非常大。这个sizeCtl在每个线程进入函数时加1,然后在每个线程退出函数前减1。
while (s >= (long)(sc = sizeCtl) && (tab = table) != null &&
(n = tab.length) < MAXIMUM_CAPACITY) {
int rs = resizeStamp(n);
if (sc < 0) {
if ((sc >>> RESIZE_STAMP_SHIFT) != rs || sc == rs + 1 ||
sc == rs + MAX_RESIZERS || (nt = nextTable) == null ||
transferIndex <= 0)
break;
if (U.compareAndSwapInt(this, SIZECTL, sc, sc + 1))
transfer(tab, nt);
}
else if (U.compareAndSwapInt(this, SIZECTL, sc,
(rs << RESIZE_STAMP_SHIFT) + 2))
transfer(tab, null);
s = sumCount();
}
这些是我的想法,但我不确定。
关于java - java8 中的 concurrentHashMap 中的 sizectl,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52026232/
因为我正在阅读 java8 中 concurrentHashMap 的源代码,我对 sizeCtl 变量有点困惑,它说 When negative, the table is being initia
我是一名优秀的程序员,十分优秀!