Skip to content

Commit fe4e314

Browse files
jjscl8888js.jiang
andauthored
fix: concurrent modification exception (#613)
When extending the MockCategoryType class, there is a concurrent modification exception in a multi-threaded environment, which ultimately leads to data loss during recording. Co-authored-by: js.jiang <[email protected]>
1 parent 3efe872 commit fe4e314

File tree

2 files changed

+58
-1
lines changed

2 files changed

+58
-1
lines changed

arex-agent-bootstrap/src/main/java/io/arex/agent/bootstrap/model/MockCategoryType.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,11 @@
44
import java.util.Collection;
55
import java.util.HashMap;
66
import java.util.Map;
7+
import java.util.concurrent.ConcurrentHashMap;
78

89
public class MockCategoryType implements Serializable {
910

10-
private static final Map<String, MockCategoryType> CATEGORY_TYPE_MAP = new HashMap<>();
11+
private static final Map<String, MockCategoryType> CATEGORY_TYPE_MAP = new ConcurrentHashMap<>(16);
1112
public static final MockCategoryType SERVLET = createEntryPoint("Servlet");
1213
public static final MockCategoryType DATABASE = createDependency("Database");
1314
public static final MockCategoryType HTTP_CLIENT = createDependency("HttpClient");
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
package io.arex.agent.bootstrap.model;
2+
3+
import io.arex.agent.bootstrap.util.Assert;
4+
import org.junit.jupiter.api.Test;
5+
6+
import java.util.ConcurrentModificationException;
7+
import java.util.concurrent.BrokenBarrierException;
8+
import java.util.concurrent.CyclicBarrier;
9+
10+
import static org.junit.jupiter.api.Assertions.assertEquals;
11+
import static org.junit.jupiter.api.Assertions.assertFalse;
12+
13+
public class MockCategoryTypeTest {
14+
15+
private static volatile boolean isError = false;
16+
17+
@Test
18+
public void test_Create() {
19+
CyclicBarrier barrier = new CyclicBarrier(10);
20+
Thread[] threads = new Thread[10];
21+
for (int i = 0; i < 10; i++) {
22+
threads[i] = new Thread(new Task(barrier, "test" + i));
23+
threads[i].start();
24+
}
25+
for (Thread thread : threads) {
26+
try {
27+
thread.join();
28+
} catch (InterruptedException e) {
29+
30+
}
31+
}
32+
assertFalse(isError, "MockCategoryType create method should not throw exception");
33+
}
34+
35+
static class Task implements Runnable {
36+
private final CyclicBarrier barrier;
37+
private final String name;
38+
39+
public Task(CyclicBarrier barrier, String name) {
40+
this.barrier = barrier;
41+
this.name = name;
42+
}
43+
44+
@Override
45+
public void run() {
46+
try {
47+
barrier.await();
48+
MockCategoryType.create(name, true, false);
49+
} catch (InterruptedException | BrokenBarrierException e) {
50+
51+
} catch (ConcurrentModificationException e) {
52+
isError = true;
53+
}
54+
}
55+
}
56+
}

0 commit comments

Comments
 (0)