可能であるべきかどうかわからないことが起こりました。私はそれを見たので、明らかにそうですが、根本的な原因を見つける必要があり、皆さんが助けてくれることを望んでいました.
郵便番号の緯度と経度を検索するシステムがあります。毎回アクセスするのではなく、安価なインメモリ HashTable キャッシュに結果をキャッシュします。これは、郵便番号の緯度と経度がリリースよりも頻繁に変更されない傾向があるためです。
とにかく、ハッシュは、両方とも同期されている「get」メソッドと「add」メソッドを持つクラスに囲まれています。このクラスにはシングルトンとしてアクセスします。
これが最良のセットアップだと主張しているわけではありませんが、それが私たちの目標です。(できるだけ早く Collections.synchronizedMap() 呼び出しで Map をラップするように変更する予定です。)
このキャッシュをマルチスレッド環境で使用し、2 つの zip に対して 2 つの呼び出しをスレッド化します (2 つの間の距離を計算できるようにするため)。これらはほぼ同時に発生する場合があるため、両方の呼び出しが同時にマップにアクセスする可能性が非常に高くなります。
つい最近、2 つの異なる郵便番号が同じ値を返すというインシデントが発生しました。初期値が実際に異なっていたと仮定すると、Map に値を書き込むと、2 つの異なるキーに対して同じ値が書き込まれる可能性はありますか? または、2 つの「取得」がワイヤを交差させて誤って同じ値を返す可能性がある方法はありますか?
私が持っている他の唯一の説明は、初期データが破損していた (間違った値) ということですが、それはほとんどありそうにありません。
どんなアイデアでも大歓迎です。ありがとう、ピーター
(PS: 詳細情報やコードなどが必要な場合はお知らせください)
public class InMemoryGeocodingCache implements GeocodingCache
{
private Map cache = new HashMap();
private static GeocodingCache instance = new InMemoryGeocodingCache();
public static GeocodingCache getInstance()
{
return instance;
}
public synchronized LatLongPair get(String zip)
{
return (LatLongPair) cache.get(zip);
}
public synchronized boolean has(String zip)
{
return cache.containsKey(zip);
}
public synchronized void add(String zip, double lat, double lon)
{
cache.put(zip, new LatLongPair(lat, lon));
}
}
public class LatLongPair {
double lat;
double lon;
LatLongPair(double lat, double lon)
{
this.lat = lat;
this.lon = lon;
}
public double getLatitude()
{
return this.lat;
}
public double getLongitude()
{
return this.lon;
}
}