發生了一些我不確定應該可能發生的事情。很明顯,因爲我已經看到了,但我需要找到根本原因&我希望你們都能幫上忙。Java HashMap中的線程問題
我們有一個系統,查找緯度經度&一個郵政編碼。我們不是每次都訪問它,而是將結果緩存在廉價的內存中的HashTable緩存中,因爲郵編長度往往比我們發佈的時間少。
不管怎麼說,哈希是由具有「get」和「添加」方法都同步類包圍。我們以單身人士的身份訪問此課程。
我不是說這是最好的設置,但它也正是我們在。 (我打算改變以包裹在一個Collections.synchronizedMap()調用地圖)儘快調用
我們在多線程環境中使用這個緩存,其中我們爲2個拉鍊線程調用2個調用(所以我們可以計算距離兩者之間)。這些情況有時幾乎在同一時間發生,因此很可能兩個呼叫同時訪問地圖。
就在最近我們遇到了一個事件,兩個不同的郵政編碼返回相同的值。假設初始值實際上是不同的,有沒有辦法將值寫入Map中會導致爲兩個不同的鍵寫入相同的值?或者,有沒有辦法讓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;
}
}
我沒有看到任何使用 「實例」。它有什麼用途?另外,如果你創建了緩存「Map」,那麼你將會更清楚你正在做什麼。 –
2008-10-28 19:34:36
我會仔細檢查InMemoryGeocodingCache.add的任何調用。 – 2008-10-28 19:36:48
如果LatLongPair是真正不可變的(沒有setter),你應該使lat和lon最終。從安全發佈/ Java內存模型的角度來看,這從併發的角度來看是有意義的。 – 2008-10-29 05:15:08