Multithreading Mbeans线程安全

Multithreading Mbeans线程安全,multithreading,list,synchronization,jmx,mbeans,Multithreading,List,Synchronization,Jmx,Mbeans,假设我有以下mbean: public interface ExampleMBean { public float lastHourMean(); } 实施情况如下: import java.util.*; public class Example implements ExampleMBean { private Map<Date, Long> dates = new HashMap<Date, Long>(); @Override public f

假设我有以下mbean:

public interface ExampleMBean {
      public float lastHourMean();
}
实施情况如下:

import java.util.*;

public class Example implements ExampleMBean {
private Map<Date, Long> dates = new HashMap<Date, Long>();


@Override
public float lastHourMean() {
    return calculateMean(getTimesFromLastHour(dates));
}

public void addDate(Date date, Long time) {
    dates.put(date, time);
    removeOldDates();
}

Map<Date, Long> getTimesFromLastHour(Map<Date, Long> dates) {
    //return dates from last hour....
}

float calculateMean(Map<Date, Long> lastHourCalls) {
    Collection<Long> values = lastHourCalls.values();
    int n = values.size();
    if (n > 0) {
        long sum = 0L;
        for (Long time : values) {
            sum = sum + time;
        }
        return sum / values.size();
    } else {
        return 0;
    }
}

public void removeOldDates() {
    //...removes dates before one hour ago from a Map "dates"..
    // to avoid buffer overflow 
}
}
现在,这个Mbean的实例以这种方式在多线程应用程序的许多函数中使用:

sampleBean.addDate(new Date(), time);

问题是函数addDate(Date,Long)和removeOldDates是否是线程安全的,如果不是,如何使这个应用程序线程安全?

这在任何方面都不是线程安全的。不仅交错是可能的,您甚至不能保证对映射的任何更改对其他线程可见

为了保证线程安全,您可能需要用
ConcurrentLinkedQueue
替换映射,因为您所描述的更像队列而不是映射。这将修复并发性问题并提高性能,因为它已经被排序了

sampleBean.addDate(new Date(), time);