我有一个包装地图的课程。地图由Add()和isUpwardTrade()方法读取/写入,如下所示。
通过同步整个方法,您是否看到任何线程安全问题? 您将如何更改以下实现(即,您是否将使用concurrentHashMap或其他?)来提高多线程上下文中的性能?
private Map<String, List<Double>> priceTable = new HashMap<String, List<Double>>();
private AutoTrader autoTrader;
public PriceTable(AutoTrader autoTrader) {
this.autoTrader = autoTrader;
}
public synchronized void add(Price price) {
if (!priceTable.containsKey(price.getProductName())){
List<Double> prices = new ArrayList<Double>();
Double pValue = price.getPrice();
prices.add(pValue);
priceTable.put(price.getProductName(), prices);
}else{
Double pValue = price.getPrice();
priceTable.get(price.getProductName()).add(pValue);
}
if (isUpwardTrend(price, priceTable)) {
notifyAutoTrader(price);
}
}
private void notifyAutoTrader(Price price) {
autoTrader.onUpwardTrendEvent(price);
}
private synchronized boolean isUpwardTrend(Price price, Map<String, List<Double>> pricesTable) {
List<Double> prices = priceTable.get(price.getProductName());
if ( prices.size() >= 4){
if ( calcAvg(prices) > prices.get(prices.size() - 4) )
return true;
}
return false;
}
答案 0 :(得分:0)
Hashmap不是线程安全的。 您应该使用ConcurrentHashMap或Hashtable。