发生了一些我不确定应该可能发生的事情。很明显,因为我已经看到了,但我需要找到根本原因&我希望你们都能帮上忙。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