0

我有一个包含地图的类。该地图由 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;
}
4

1 回答 1

0

Hashmap 不是线程安全的。您应该使用 ConcurrentHashMap 或 Hashtable。

于 2013-04-08T00:57:40.727 回答