发现打印hashSet.size()数量与预期的20001不一致。由于频繁add的键为同一个导致,尝试ConcurrentHashSet并发函数,问题解决。
package com.example.demo;
import com.alibaba.nacos.common.utils.ConcurrentHashSet;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.HashSet;
import java.util.UUID;
import java.util.concurrent.CountDownLatch;
@SpringBootTest
class DemoApplicationTests {
@Test
void contextLoads() {
int threadNum = 20000;
CountDownLatch countDownLatch = new CountDownLatch(threadNum);
HashSet<String> hashSet = new HashSet<>();
//试试下边的并发函数
//ConcurrentHashSet<String> hashSet = new ConcurrentHashSet<>();
for (int i = 0; i < threadNum; i++) {
new Thread(new Runnable() {
@Override
public void run() {
hashSet.add("sd");
String token = UUID.randomUUID().toString().replaceAll("-", "");
System.out.printf("在线程(%s)中创建uuid(%s)\n", Thread.currentThread(), token);
hashSet.add(token);
countDownLatch.countDown();
}
}).start();
}
try {
countDownLatch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("大家都到齐了,那就开始吧");
System.out.println(hashSet.size());
System.out.println(hashSet);
}
}