/**
* @author Johny 林子豪
* 多線程集合插入元素的性能對比。
*/
public class ListTest {
private static final List<String> listA = new Vector<>();
private static final List<String> listB = Collections.synchronizedList(new ArrayList<>());
private static final Queue<String> listC = new ConcurrentLinkedQueue<>();
private static final AbstractSet<String> listD = new ConcurrentSkipListSet<>();
private static final Set<String> listE = Collections.synchronizedSet(new HashSet<>());
private static final AtomicInteger factor = new AtomicInteger(0);
public static String getTestStr() {
StringBuilder str = new StringBuilder().append(factor.getAndIncrement())
.append(":").append(factor.getAndIncrement())
.append("&").append(factor.getAndIncrement())
.append("&").append(factor.getAndIncrement());
return str.toString();
}
//構建測試數據
private static List<String> prepareData() {
int b = 10000;
int a = 1000;
CountDownLatch countDownLatch = new CountDownLatch(a * b);
List<String> dataList = Collections.synchronizedList(new ArrayList<>(800000));
for (int i = 0; i < a; i++) {
executorService.submit(() -> {
for (int j = 0; j < b; j++) {
dataList.add(getTestStr());
countDownLatch.countDown();
}
});
}
try {
countDownLatch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
return dataList;
}
private final static ExecutorService executorService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
public static void addAllVector(List<String> list) {
listA.addAll(list);
}
public static void addAllSynchronizedList(List<String> list) {
listB.addAll(list);
}
public static void addAllConcurrentLinkedQueue(List<String> list) {
listC.addAll(list);
}
public static void addAllConcurrentSkipListSet(List<String> list) {
listD.addAll(list);
}
public static void addAllSynchronizedSet(List<String> list) {
listE.addAll(list);
}
public static void manyThreadTest() {
List<String> datas = prepareData();
long startTime = System.currentTimeMillis();
addAllVector(datas);
System.err.println("addAllVector->" + (System.currentTimeMillis() - startTime));
startTime = System.currentTimeMillis();
addAllSynchronizedList(datas);
System.err.println("addAllSynchronizedList->" + (System.currentTimeMillis() - startTime));
startTime = System.currentTimeMillis();
addAllConcurrentLinkedQueue(datas);
System.err.println("addAllConcurrentLinkedQueue->" + (System.currentTimeMillis() - startTime));
startTime = System.currentTimeMillis();
addAllConcurrentSkipListSet(datas);
System.err.println("addAllConcurrentSkipListSet->" + (System.currentTimeMillis() - startTime));
startTime = System.currentTimeMillis();
addAllSynchronizedSet(datas);
System.err.println("addAllSynchronizedSet->" + (System.currentTimeMillis() - startTime));
}
public static void test() {
System.err.println("多線程性能對比:");
manyThreadTest();
executorService.shutdown();
}
public static void main(String[] args) {
test();
}
}
測試結果如圖: