concurrent

This commit is contained in:
zzz
2010-11-14 15:01:23 +00:00
parent dc6fc0185c
commit 1e0e24826e

View File

@ -2,13 +2,13 @@ package net.i2p.stat;
import java.text.Collator;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
import java.util.TreeSet;
import java.util.concurrent.ConcurrentHashMap;
import net.i2p.I2PAppContext;
import net.i2p.util.Log;
@ -25,9 +25,9 @@ public class StatManager {
private I2PAppContext _context;
/** stat name to FrequencyStat */
private final Map<String, FrequencyStat> _frequencyStats;
private final ConcurrentHashMap<String, FrequencyStat> _frequencyStats;
/** stat name to RateStat */
private final Map<String, RateStat> _rateStats;
private final ConcurrentHashMap<String, RateStat> _rateStats;
/** may be null */
private StatLog _statLog;
@ -71,8 +71,8 @@ public class StatManager {
public StatManager(I2PAppContext context) {
_log = context.logManager().getLog(StatManager.class);
_context = context;
_frequencyStats = Collections.synchronizedMap(new HashMap(8));
_rateStats = new HashMap(128); // synchronized only on add //Collections.synchronizedMap(new HashMap(128));
_frequencyStats = new ConcurrentHashMap(8);
_rateStats = new ConcurrentHashMap(128);
if (getStatFilter() != null)
_statLog = new BufferedStatLog(context);
}
@ -81,13 +81,11 @@ public class StatManager {
public StatLog getStatLog() { return _statLog; }
public void setStatLog(StatLog log) {
_statLog = log;
synchronized (_rateStats) {
for (Iterator<RateStat> iter = _rateStats.values().iterator(); iter.hasNext(); ) {
RateStat rs = iter.next();
rs.setStatLog(log);
}
}
}
/**
* Create a new statistic to monitor the frequency of some event.
@ -100,7 +98,7 @@ public class StatManager {
public void createFrequencyStat(String name, String description, String group, long periods[]) {
if (ignoreStat(name)) return;
if (_frequencyStats.containsKey(name)) return;
_frequencyStats.put(name, new FrequencyStat(name, description, group, periods));
_frequencyStats.putIfAbsent(name, new FrequencyStat(name, description, group, periods));
}
/**
@ -113,20 +111,16 @@ public class StatManager {
*/
public void createRateStat(String name, String description, String group, long periods[]) {
if (ignoreStat(name)) return;
synchronized (_rateStats) {
if (_rateStats.containsKey(name)) return;
RateStat rs = new RateStat(name, description, group, periods);
if (_statLog != null) rs.setStatLog(_statLog);
_rateStats.put(name, rs);
}
_rateStats.putIfAbsent(name, rs);
}
// Hope this doesn't cause any problems with unsynchronized accesses like addRateData() ...
public void removeRateStat(String name) {
synchronized (_rateStats) {
_rateStats.remove(name);
}
}
/** update the given frequency statistic, taking note that an event occurred (and recalculating all frequencies) */
public void updateFrequency(String name) {
@ -146,15 +140,12 @@ public class StatManager {
public void coalesceStats() {
if (++coalesceCounter % FREQ_COALESCE_RATE == 0) {
synchronized (_frequencyStats) {
for (FrequencyStat stat : _frequencyStats.values()) {
if (stat != null) {
stat.coalesceStats();
}
}
}
}
synchronized (_rateStats) {
for (Iterator<RateStat> iter = _rateStats.values().iterator(); iter.hasNext();) {
RateStat stat = iter.next();
if (stat != null) {
@ -162,7 +153,6 @@ public class StatManager {
}
}
}
}
public FrequencyStat getFrequency(String name) {
return _frequencyStats.get(name);