我想增加不存在的值,并增加它的存在。而且我有很多线程,因此应该是线程安全的。
我喜欢这样:
private ConcurrentHashMap<Long, LongAdder> map = new ConcurrentHashMap<>();
public void increment() {
Long key = timeRoundService.roundToSecond(Instant.now());//round seconds
map.computeIfAbsent(key, (k) -> new LongAdder()).add(1);
}
但是它没有用。我做错了什么?
我将具有[[synchronized]]方法,以便没有冲突的键。我认为您的问题是您有重复的密钥。private Map<Long, LongAdder> map = new HashMap<>();
public synchronized void increment() {
Long key = timeRoundService.roundToSecond(Instant.now());//round seconds
map.computeIfAbsent(key, (k) -> new LongAdder()).add(1);
}
这样,每次有一个线程将访问该方法,因此您不会有重复的键
您可以尝试使用:
private static Map<Long, LongAdder> map = new HashMap<>();
public static synchronized void increment() {
Long key = Instant.now().truncatedTo(ChronoUnit.SECONDS).getLong(INSTANT_SECONDS);//round seconds
map.computeIfAbsent(key, (k) -> new LongAdder()).add(1);
}
public static void main(String[] args) throws IOException {
for (int i = 0; i < 100; i++) {
Thread thread = new Thread(() -> {
increment();
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
});
thread.run();
}
System.out.println(map);
}