我创建了一个例子来理解并发HashMap,但它似乎在7-8次运行后给出了不确定的输出。
在我的示例中,我创建了三个线程(它们模仿三个服务来获取数学、科学、英语的分数),它们更新了一个只有3个键值对的并发HashMap (键是三个名称A、B、C,运行结束时的值应该是三个主题的累积分数)
我正在张贴下面的代码,请告知。
错误的输出如下所示(正确的输出应该结束为be All Done main:{C=27,A=57,B=42})
Within run Math : {C=0, A=0, B=0}
Within run Science : {C=0, A=0, B=0}
Completed Scien
无论什么要求,我都愿意给出一个完整的答案。为此,我使用以下代码
public class IntIDGenerator {
private static int sequence = 1;
public synchronized static int generate(){
sequence++;
return sequence;
}
}
它是线程安全的,因为方法generate()中的同步术语,但我觉得可以更好地实现这个生成。我是在用AtomicInteger思考,但我或多或少也会遇到同样的问题。有什么暗示吗?
我正在用Aspectj做一些分析。
我需要唯一地标识访问字段的方法的实例,例如:
public class Class{ int a; int b;
public void method1(){
setA(5);
setB(6);
在本例中,使用AspectJ,我可以通过setA和SetB方法获得对a和b的访问。并使用
Thread.currentThread().getStackTrace();
我知道method1()已经调用了setA和setB。
方法的名称是不够的,我还需要明确地标识该方法的实例。
例如,如果多次调用method1,我必须区分对a的访问和对b的访问是由不同的
我试图在ConcurrentHashMap中的一个对象中递增一个值,但它总是给出意外的输出。我也尝试过使用AtomicInteger,但它是一样的。预期的输出是John和Doe各有100个计数。然而,这并没有发生。似乎是什么问题。这在没有Data对象作为值的情况下工作得很好。 导入java.util.concurrent.atomic.AtomicInteger; public class Data {
private AtomicInteger count;
public Data() {
}
public Data(AtomicInteger cou
在多线程代码中,我在第3行看到了ConcurrentModificationException。
line 1: Map<String, String> attributMap = new HashMap<>();
line 2: if(attributeMap.size() > 0)
line 3: tagMyEvent(new HashMap<>(attributeMap));
java.util.ConcurrentModificationException
1 at java.util.HashMap$Hash
我正在尝试创建一个具有Map值的int值,并通过多个线程来增加它们。两个或多个线程可能会增加相同的键。
ConcurrentHashMap文档对我来说非常不清楚,因为它说明:
Retrieval operations (including get) generally do not block, so may overlap with update operations (including put and remove)
我想知道以下使用ConcurrentHashMap的代码是否正确地工作
myMap.put(X, myMap.get(X) + 1);
如果没有,我又如何处理这些事情呢?
要在spring引导应用程序中本地缓存一些数据,哪种技术在读写操作方面会更好?HashMap vs ConcurrentHashMap vs LoadingCache (番石榴库)--我试着对其中的每一个操作进行读写操作,HashMap是最快的,LoadingCache是最慢的,那么我们为什么要使用LoadingCache呢?
编辑:应用程序是多线程的。和功能,如最大大小的缓存,到期时间可能会受到损害。此外,主要的动机是提高阅读速度。
我试图在多线程环境中实现某种积累逻辑;我想知道在没有锁和同步关键字的情况下是否有更好/更快的方法来实现它?以下是我的当前代码:
public class ConcurrentHashMapTest {
private static final int NB_THREADS = 1_000;
private final Map<String, Integer> cnts = new HashMap<>();
private static final Lock RWLOCK = new ReentrantLock(true);
pri
在我的应用程序中,我有几个HashMaps。其中一个确实会偶尔抛出ConcurrentModificationException。问题是,我不知道如何跟踪哪个映射实际抛出了它,以及ConcurrentModification何时发生。堆栈跟踪不会显示发生跟踪的位置的任何行号。堆栈跟踪的开头看起来像这样:
java.util.ConcurrentModificationException
at java.util.HashMap$HashIterator.nextEntry(HashMap.java:806)
at java.util.HashMap$ValueIterator.next(Has
请有人指导我如何使用Java 8实现以下功能。我不知道如何将计数器作为关键的
String str = "abcd";
Map<Integer,String> map = new HashMap<>();
String[] strings = str.split("");
int count =0;
for(String s:strings){
map.put(count++, s);// I want the counter as the key
}
在CACallHandler类中有一个由我创建的方法,即checkCallAllowed。我把所有的东西都当成了ConcurrentHashMap和AtomicInteger。
请忽略checkCallAllowed的逻辑,但我想知道,如果多个线程同时访问同一对象上的这个方法,那么它是否安全。
我不想synchronize整个方法,因为这样会影响性能。
请求您的帮助。
我已经用30个线程执行了这个方法,有没有同步方法,两者都给出了相同的结果。所以如果有200个线程,那么它是安全的还是不安全的。
public class CACallHandler {
public ThrottleCallA
尝试用以下代码测试两个TreeMap是相同的:
public class StreamTest {
private Stream stream;
private Map<String, AtomicInteger> map = new HashMap<>();
@Before
public void setup() {
stream = new Stream();
map.put("this", new AtomicInteger(1));
map.put("is", new AtomicInt
我正在做一个项目,在这个项目中,我要连接到数据库。如果有的话,我需要看一次exception is happening的次数。我正在使用Multithreaded code,这意味着多个线程将连接到数据库并插入数据库。因此,可能在某个时候连接会丢失,所以我们需要查看这些异常发生了多少次。
因此,我编写了下面的代码,在catch块中,我捕获异常,并在每次出现异常时设置一个计数器,并将其放入ConcurrentHashMap中。
class Task implements Runnable {
public static final AtomicInteger counter_sql_