巨大な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 ) {
....
}