线程安全的HashMap访问

时间:2013-04-08 00:47:14

标签: thread-safety hashmap synchronized

我有一个包装地图的课程。地图由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;
}

1 个答案:

答案 0 :(得分:0)

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