Java的Vector等線程安全list的插入性能對比

/**
 * @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();
    }

}

測試結果如圖:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章