Multithreading Mbeans线程安全
假设我有以下mbean: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
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);