1.1 目标


解决parallelStream线程安全问题
image.png
image.png

运行效果:


image.png

我们明明是往集合中添加1000个元素,而实际上只有903个元素。

解决方法: 加锁、使用线程安全的集合或者调用Stream的 toArray() / collect() 操作就是满足线程安全的了。


  1. // parallelStream线程安全问题
  2. @Test
  3. public void parallelStreamNotice() {
  4. ArrayList<Integer> list = new ArrayList<>();
  5. /*IntStream.rangeClosed(1, 1000)
  6. .parallel()
  7. .forEach(i -> {
  8. list.add(i);
  9. });
  10. System.out.println("list = " + list.size());*/
  11. // 解决parallelStream线程安全问题方案一: 使用同步代码块
  12. /*Object obj = new Object();
  13. IntStream.rangeClosed(1, 1000)
  14. .parallel()
  15. .forEach(i -> {
  16. synchronized (obj) {
  17. list.add(i);
  18. }
  19. });*/
  20. // 解决parallelStream线程安全问题方案二: 使用线程安全的集合
  21. // Vector<Integer> v = new Vector();
  22. /*List<Integer> synchronizedList = Collections.synchronizedList(list);
  23. IntStream.rangeClosed(1, 1000)
  24. .parallel()
  25. .forEach(i -> {
  26. synchronizedList.add(i);
  27. });
  28. System.out.println("list = " + synchronizedList.size());*/
  29. // 解决parallelStream线程安全问题方案三: 调用Stream流的collect/toArray
  30. List<Integer> collect = IntStream.rangeClosed(1, 1000)
  31. .parallel()
  32. .boxed()
  33. .collect(Collectors.toList());
  34. System.out.println("collect.size = " + collect.size());
  35. }