- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我在ConcurrentHashMap中阅读了addCount
函数的源代码,
但我不知道什么时候可以实现( sc == rs + 1 || sc == rs + MAX_RESIZERS)
条件。
为什么不使用sc == ( rs<<<RESIZE_STAMP_SHIFT ) +1 || sc == ( rs<<<RESIZE_STAMP_SHIFT ) + MAX_RESIZERS
在ConcurrentHashMap(JDK1.8或更高版本)的addCount(long x, int check)
函数中,有一些如下代码
if(check >=0{
Node<K, V>[] tab, nt;
int n, sc;
while (s >= (long) (sc = sizeCtl) && (tab = table) != null &&
(n = tab.length) < MAXIMUM_CAPACITY) {
int rs = resizeStamp(n);
if (sc < 0) {
// the problem is here :
// the condition sc == rs + 1 || sc == rs + MAX_RESIZERS
// seems always to be false
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();
}
}
sizeCtl
的工作方式。
U.compareAndSwapInt(this, SIZECTL, sc,(rs << RESIZE_STAMP_SHIFT) + 2)
sizeCtl
变为负值,这可以表示有些线程正在对bucket数组进行大小调整。
sizeCtl
变为负数时,低16位包含有关并行调整大小的线程的信息。
sc
是本地int变量,如代码所示
int n, sc;
s >= (long) (sc = sizeCtl)
之后,
sc
的值将永远不会更改。
addCount
函数中有两部分:
else if (U.compareAndSwapInt(this, SIZECTL, sc, (rs << RESIZE_STAMP_SHIFT) + 2))
if ( U.compareAndSwapInt(this, SIZECTL, sc, sc + 1) )
transfer
功能
sizeCtl = Integer.MAX_VALUE;
sizeCtl = (n << 1) - (n >>> 1);
transfer
返回的线程会将sizeCtl设置为下一个阈值,即0.75 * (2n)
,请注意n
是旧容量。 2n
是新容量U.compareAndSwapInt(this, SIZECTL, sc = sizeCtl, sc - 1)
if (sc < 0)
(这意味着
sizeCtl
已由
(rs << RESIZE_STAMP_SHIFT) + 2
分配)后,
sc
shuold是一个“大”负数,从
resizeStamp(n)
计算得出的高16位。条件
sc == rs + 1
||sc == rs + MAX_RESIZERS
MAX_RESIZERS
等于65535 rs
的最大值是Integer.numberOfLeadingZeros(MAXIMUM_CAPACITY ) | (1 << (RESIZE_STAMP_BITS - 1))
,等于32769 sc == ( rs<<<RESIZE_STAMP_SHIFT ) +1
判断所有线程是否完成大小调整
sc == ( rs<<<RESIZE_STAMP_SHIFT ) + MAX_RESIZERS
判断调整线程大小是否已达到最大限制MAX_RESIZERS。
ConcurrentHashMap
源代码复制到您自己的包private static final int MAX_RESIZERS = 2;
public static void main(String[] args) {
ConcurrentHashMap hashMap = new ConcurrentHashMap(8);
for(int i = 0; i< 300; i++)
{
new Thread() {
@Override
public void run() {
hashMap.put(Thread.currentThread().getId(),"id: "+Thread.currentThread().getId());
}
}.start();
}
transfer
函数中。暂停输入
transfer
的任何线程
if (nextTab == null) { // initiating
try {
@SuppressWarnings("unchecked")
Node<K,V>[] nt = (Node<K,V>[])new Node<?,?>[n << 1];
nextTab = nt;
} catch (Throwable ex) { // try to cope with OOME
sizeCtl = Integer.MAX_VALUE;
return;
}
nextTable = nextTab;
transferIndex = n;
}
// The following added code here is to suspend Threads !!!!
try {
String s = new String();
synchronized (s)
{
s.wait();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
addCount
函数的以下代码行中添加线程断点 if (U.compareAndSwapInt(this, SIZECTL, sc, sc + 1))
transfer(tab, nt);
transfer
函数,这意味着MAX_RESIZERS不起作用。 最佳答案
我已将此问题作为错误报告提交给Oracle。它已通过评估,并在带有错误ID的JDK错误数据库中可见:JDK-8214427
这是错误报告的链接:BUG: JDK-8214427。注意由于我的错误,错误报告中给出的修复方法是错误的
总结:
条件
( sc == rs + 1 || sc == rs + MAX_RESIZERS)
sc == ( rs<<<RESIZE_STAMP_SHIFT ) +1 || sc == ( rs<<<RESIZE_STAMP_SHIFT ) + MAX_RESIZERS
if (check >= 0) {
Node<K,V>[] tab, nt; int n, sc;
while (s >= (long)(sc = sizeCtl) && (tab = table) != null &&
(n = tab.length) < MAXIMUM_CAPACITY) {
int rs = resizeStamp(n) << RESIZE_STAMP_SHIFT;
if (sc < 0) {
if (sc == rs + MAX_RESIZERS || sc == rs + 1 ||
(nt = nextTable) == null || transferIndex <= 0)
break;
if (U.compareAndSetInt(this, SIZECTL, sc, sc + 1))
transfer(tab, nt);
}
else if (U.compareAndSetInt(this, SIZECTL, sc, rs + 2))
transfer(tab, null);
s = sumCount();
}
}
关于java - 如何在ConcurrentHashMap(JDK1.8或更高版本)的addCount函数中实现条件(sc == rs + 1 || sc == rs + MAX_RESIZERS),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53493706/
我是 Spark 的新手。有人可以清除我的疑问吗: 让我们假设下面是我的代码: a = sc.textFile(filename) b = a.filter(lambda x: len(x)>0 an
问题 每行输入都将包含一个字符串,后跟一个整数。每个字符串最多包含 10 个字母字符,每个整数都在 0 到 999 的范围内 输出代码 在输出的每一行中应该有两列:第一列包含字符串,并使用 15 个字
我希望从不同供应商、不同用途、不同 APDU 的一堆智能卡中读取一些基本信息。例如:国家身份识别智能卡、EMV(支付)、手机SIM、javacard等... 我编写了一个 Java 应用程序。让我将
我有一组我想读入 RDD 的日志文件。 这些日志文件都是压缩的 gzip 文件,文件名是 日期盖章。 我一直在用sc.wholeTextFiles()读入文件,似乎我遇到了 Java 堆内存问题。为了
我使用以下命令创建服务:sc create MyService binpath= "C:\Path\MyDriver.sys" 返回的消息是:[SC] CreateService SUCCESS,但是
我使用 Spring mvc,我的问题是关于 sendError方法来自 HttpServletResponse . 有人可以告诉我哪个最好: @RequestMapping(method = Req
class superClass {} class subClass extends superClass{} public class test { public static void m
我在ConcurrentHashMap中阅读了addCount函数的源代码, 但我不知道什么时候可以实现( sc == rs + 1 || sc == rs + MAX_RESIZERS)条件。 为什
我正在尝试使用 Sproutcore 呈现 UI,其中我有一个列表列表。有一个垂直的数据列表,其中每个关联的项目都有自己的项目列表。我已经根据我对 Sproutcore 的了解设置了我认为合适的模型。
当我通过 http://software.intel.com/en-us/android 安装 Intelhaxm 时并且我成功安装了,但是当我尝试使用管理员在命令提示符下验证 Intelhaxm 是
我试图在我的 MVC - Sitecore - 7.1 中的 v4.0.30319 项目中使用 Glass Mapper。 以下是我安装的 Glass Mapper 版本 Glass Mapper 版
在我通过取消注释文件中的以下行来更改 svnserve.conf 之后,我正在尝试使用 cmd 创建一个 svnserver, anon-access = read auth-access = wri
有没有办法让 java 使用 javax.smartcardio.TerminalFactory 识别我的 NFC 读卡器? 我正在使用 Ubuntu 13.04 并使用 pcsc_scan 我能够读
我正在使用 sc.exe 命令来安装 C# windows 服务。 C:Windows\System32> sc.exe Create "TestService1" binPath= "C:\Prog
sc-bytes 代表什么?每一个关于 sc-bytes 的讨论和博客都声明它代表从服务器到客户端的字节。 想知道sc-bytes是否代表总响应字节数, 例如,。当我们访问任何 URL 时,它是否包含
topLeftView: SC.ScrollView.design({ backgroundColor: "#DADFE6", childViews: 'labLabel labMem
我想将一些已解析的 JSON 数据从我的 Controller 推送到 SC.SourceListView (Sproutcore Showcase) .我使用 SC.TreeController并将
您对此有什么解决方案吗? 我想得到 SC.SceneView从下到上过渡,而不是从左到右或从右到左。 Doc在这里并没有说太多,但是由于原始转换必须在某个地方,也许我可以为此创建其方法的原型(prot
我正在基于SproutCore 1.8的项目中。我的应用程序必须在复杂的表格 View 中显示大量数据。实际上,表格 View 将成为应用程序界面的核心元素之一。另外,我可能需要大纲/树 View ,
我正在尝试在SproutCore应用程序中按部门显示联系人列表,并尝试将SC.ListView嵌套在另一个SC.ListView中无济于事。 我可以use SC.GridView to assist,
我是一名优秀的程序员,十分优秀!