如何为多写多读(线程)添加和删除HashMap?
How to add and remove from HashMap for many writers and many readers (threads)?
是否可以在没有关键字 synchronized 的情况下解决此代码?
我们可以将 ConcurrentHashMap 或更好的 HashMap 与 synchronized 关键字一起使用(用于方法)吗?
或者更好的 ConcurrentHashMap(用于迭代)与 synchronized 关键字(用于方法)?
这是关键部分代码,reader线程获取统计信息并在递减值时(如果值为零,则删除统计信息但并行写入器线程可能会增加值)。如何正确解决这个问题?
Statistic statistic = data.get(id);
if (statistic != null) {
statistic.dec();
if (statistic.getValue() <= 0) {
data.remove(id);
}
public class Main {
private static final Map<Long, Statistic> data = new ConcurrentHashMap<>();
public static void main(String... args) throws IOException {
new Thread(() -> todoRunInWriterThread(1L)).start();
new Thread(() -> todoRunInReaderThread(1L)).start();
System.in.read();
}
//Many writers write some statistics
private static void todoRunInWriterThread(long id) {
Statistic statistic = data.get(id);
if (statistic == null) {
statistic = new Statistic();
data.put(id, statistic);
}
statistic.inc();
}
//Many readers read statistic and decrement value,
//if statistic value is zero (remove statistic)
private static void todoRunInReaderThread(long id) {
Statistic statistic = data.get(id);
if (statistic != null) {
statistic.dec();
if (statistic.getValue() <= 0) {
data.remove(id);
}
}
}
public static class Statistic {
private AtomicLong value = new AtomicLong(0);
public long getValue() {
return value.longValue();
}
public void inc() {
value.incrementAndGet();
}
public void dec() {
value.decrementAndGet();
}
}
}
我相信你应该使用 ConcurrentHashMap。它在大多数情况下具有良好的性能,并且您的编写器线程的情况(获取...检查是否为空...放置)可以通过 ConcurrentHashMap#computeIfAbsent 解决 -> 它将在内部处理所有锁定。
另外请研究一下 ConcurrentHashMap 的工作原理。它不是简单地为每个方法使用 synchronized 关键字。涉及一些条带化锁定,这对性能非常有益
是否可以在没有关键字 synchronized 的情况下解决此代码?
我们可以将 ConcurrentHashMap 或更好的 HashMap 与 synchronized 关键字一起使用(用于方法)吗?
或者更好的 ConcurrentHashMap(用于迭代)与 synchronized 关键字(用于方法)?
这是关键部分代码,reader线程获取统计信息并在递减值时(如果值为零,则删除统计信息但并行写入器线程可能会增加值)。如何正确解决这个问题?
Statistic statistic = data.get(id);
if (statistic != null) {
statistic.dec();
if (statistic.getValue() <= 0) {
data.remove(id);
}
public class Main {
private static final Map<Long, Statistic> data = new ConcurrentHashMap<>();
public static void main(String... args) throws IOException {
new Thread(() -> todoRunInWriterThread(1L)).start();
new Thread(() -> todoRunInReaderThread(1L)).start();
System.in.read();
}
//Many writers write some statistics
private static void todoRunInWriterThread(long id) {
Statistic statistic = data.get(id);
if (statistic == null) {
statistic = new Statistic();
data.put(id, statistic);
}
statistic.inc();
}
//Many readers read statistic and decrement value,
//if statistic value is zero (remove statistic)
private static void todoRunInReaderThread(long id) {
Statistic statistic = data.get(id);
if (statistic != null) {
statistic.dec();
if (statistic.getValue() <= 0) {
data.remove(id);
}
}
}
public static class Statistic {
private AtomicLong value = new AtomicLong(0);
public long getValue() {
return value.longValue();
}
public void inc() {
value.incrementAndGet();
}
public void dec() {
value.decrementAndGet();
}
}
}
我相信你应该使用 ConcurrentHashMap。它在大多数情况下具有良好的性能,并且您的编写器线程的情况(获取...检查是否为空...放置)可以通过 ConcurrentHashMap#computeIfAbsent 解决 -> 它将在内部处理所有锁定。
另外请研究一下 ConcurrentHashMap 的工作原理。它不是简单地为每个方法使用 synchronized 关键字。涉及一些条带化锁定,这对性能非常有益