Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ’;扫描和锁定输出‘;在ConcurrentHashMapJDK1.7中_Java_Concurrency_Java.util.concurrent_Concurrenthashmap - Fatal编程技术网

Java ’;扫描和锁定输出‘;在ConcurrentHashMapJDK1.7中

Java ’;扫描和锁定输出‘;在ConcurrentHashMapJDK1.7中,java,concurrency,java.util.concurrent,concurrenthashmap,Java,Concurrency,Java.util.concurrent,Concurrenthashmap,我的问题是关于文件中的一句话: 与大多数方法不同,对方法equals的调用是不被屏蔽的:因为遍历速度无关紧要,我们还可以帮助预热相关的代码和访问 我不能理解上面的句子。具体来说,“未筛选”是什么意思?为什么我们可以“预热相关代码” 扫描锁定输出 private HashEntry scanAndLockForPut(K键,int散列,V值){ HashEntry first=entryForHash(这是hash); hash条目e=第一; HashEntry节点=null; int retri

我的问题是关于文件中的一句话:

与大多数方法不同,对方法equals的调用是不被屏蔽的:因为遍历速度无关紧要,我们还可以帮助预热相关的代码和访问

我不能理解上面的句子。具体来说,“未筛选”是什么意思?为什么我们可以“预热相关代码”

扫描锁定输出

private HashEntry scanAndLockForPut(K键,int散列,V值){
HashEntry first=entryForHash(这是hash);
hash条目e=第一;
HashEntry节点=null;
int retries=-1;//查找节点时为负数
而(!tryLock()){
HashEntry f;//要重新检查下面的第一项
如果(重试次数<0){
如果(e==null){
if(node==null)//推测性地创建节点
node=newhashentry(散列、键、值、null);
重试次数=0;
}
else if(key.equals(e.key))
重试次数=0;
其他的
e=e.next;
}
否则,如果(++重试次数>最大扫描次数){
锁();
打破
}
如果((重试次数&1)=0,则为else&&
(f=entryForHash(this,hash))!=first){
e=first=f;//如果条目更改,则重新遍历
重试次数=-1;
}
}
返回节点;
具体来说,“未筛选”是什么意思

在此上下文中,“screen”表示在调用equals之前检查标识。以下语句的左侧也取自CHM:

if ((k = e.key) == key || (e.hash == hash && key.equals(k)))
因此,“未筛选”意味着跳过身份检查

为什么我们可以“预热相关代码”

在key上使用equals方法来确定匹配项,在预热情况下更重要的是确定不匹配项,即使您正在筛选标识,也将始终调用equals。如果等待的线程都开始调用key.equals,这将使其“热”并更快地触发JIT编译。更快的equals方法意味着在put过程中保持段锁的时间更短


同样重要的是要注意,在JDK 8中,这一切都已经改变。

我认为,由于锁保持时间很短,它试图在等待时预热缓存,而不是锁定,并且可能会发生上下文切换。
if ((k = e.key) == key || (e.hash == hash && key.equals(k)))