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