有关CountDownLatch的问题,代码如下所示。

public class CountDownTest {

public static Map<String, String> b(Map<String, String> map) {
    ThreadPoolExecutor executor = new ThreadPoolExecutor(3, 3, 0L, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(12));
    HashMap<String, String> hashMap = new HashMap<>();
    int size = map.size();
    try {
        CountDownLatch countDownLatch = new CountDownLatch(size);
        map.forEach((k, v) -> {
            executor.submit(

                    () -> {
                        String a = v + "2";
                        hashMap.put(k, a);
                        countDownLatch.countDown();
                    }
            );
        });
        countDownLatch.await();
        return hashMap;
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        executor.shutdown();
        return hashMap;
    }
}
public static void main(String[] args) {
    Map<String, String> map = new HashMap<>();
    map.put("1", "a");
    map.put("2", "b");
    map.put("3", "c");
    Map<String, String> a = b(map);
    for (String l : a.keySet()) {
        System.out.println(a.get(l));
    }
}

}
大多数情况下输出: a2,b2,c2 但有时也会输出 a2,b2,或b2,c2,或a2,c2 这种情况,问题出在哪?

img


首先CountDownLatch只是控制并发数量,并不保证并发顺序。图片里框出的地方里启动了多个线程去打印,但是你没有控制打印顺序的代码