【问题标题】:How to synchonized this lambda statement?如何同步此 lambda 语句?
【发布时间】:2023-01-19 16:40:47
【问题描述】:

Java / JDK 19. 如何同步这个 lambda 语句?

package sybex.ch00.exercies;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.IntStream;

public class Q03 {

    public static void main(String[] args) {
        List<Integer> data = new ArrayList<>();
        IntStream.range(0, 100).parallel().forEach(s -> data.add(s));
        System.out.println(data.size());
    }
}

我看过书,他们说在synchronizedlamba 之后将使线程安全,并返回100,但我不知道该怎么做。请指导我。

【问题讨论】:

    标签: java


    【解决方案1】:

    没有什么特别的技巧,只需使用 synchronized 块:

    public class Q03 {
    
        public static void main(String[] args) {
            List<Integer> data = new ArrayList<>();
            IntStream.range(0, 100).parallel().forEach(s -> {
                synchronized(data) { data.add(s); }
            });
            System.out.println(data.size());
        }
    }
    

    根据您在其中运行它的上下文,您将必须选择要同步的对象。 data 是一个不错的选择,或者您可以创建一个对象来锁定:

    public class Q03 {
    
        public static void main(String[] args) {
            List<Integer> data = new ArrayList<>();
            Object lock = new Object();
            IntStream.range(0, 100).parallel().forEach(s -> {
                synchronized(lock) { data.add(s); }
            });
            System.out.println(data.size());
        }
    }
    

    【讨论】:

      【解决方案2】:

      我会使用Collections.synchronizedList

      public static void main(String[] args) {
          List<Integer> data = Collections.synchronizedList(new ArrayList<>());
          IntStream.range(0, 100).parallel().forEach(s -> data.add(s));
          System.out.println(data.size());
      }
      

      使用该列表的迭代器时要小心,请参阅链接的 JavaDocs。

      或者,您可以使用 java.util.concurrent 中的一个并发集合,但对于您展示的案例,CopyOnWriteArrayList 可能存在严重的性能问题。另一方面,我没有检查上述解决方案的性能。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-25
        • 1970-01-01
        • 2012-03-29
        相关资源
        最近更新 更多