我有一个巨大的 Trove 地图和一个我需要经常从多个线程调用的方法。大多数情况下,此方法应返回true。线程正在进行大量的数字运算,我注意到由于以下方法而存在一些争用(这只是一个示例,我的实际代码有点不同):
synchronized boolean containsSpecial() {
return troveMap.contains(key);
}
请注意,它是一个“仅附加”映射:一旦添加了一个键,它就会永远保留在那里(这对我认为接下来发生的事情很重要)。
我注意到通过将上述内容更改为:
boolean containsSpecial() {
if ( troveMap.contains(key) ) {
// most of the time (>90%) we shall pass here, dodging lock-acquisition
return true;
}
synchronized (this) {
return troveMap.contains(key);
}
}
我的数字运算速度提高了 20%(经过大量运行、长时间运行等验证)。
这种优化看起来是否正确(知道一旦有密钥,它将永远留在那里)?
这种技术的名称是什么?
编辑
更新地图的代码调用频率低于containsSpecial()方法,看起来像这样(我已经同步了整个方法):
synchronized void addSpecialKeyValue( key, value ) {
....
}