使用并行流时的数据完整性

时间:2019-04-22 16:01:08

标签: java multithreading thread-safety java-stream

我已经实现了以下内容,但尚未对大量数据进行测试。

public class Main {
    public static void main(String[] args) {
        CombinedData combinedData = new CombinedData();
        List<String> nameList = Arrays.asList("x1", "x3", "x2");
        nameList.parallelStream().forEach(name -> {
            populateDetails(name, combinedData);
        });
    }

    static void log(String str) {
        System.out.println(str);
    }

    static void populateDetails(String name, CombinedData combinedData) {
        if (combinedData.getOrg() == null) {
            combinedData.setOrg(MyUtil.getOrg(name));
        }
        if (combinedData.getRawData() != null) {
            combinedData.setRawData(combinedData.getRawData() + name);
        }
        combinedData.addToDetails(new Details(name, MyUtil.getAdd(name)));
    }
}

class CombinedData {
    private String org;
    private List<Details> details;
    private String rawData;

    public String getOrg() {
        return org;
    }

    public void setOrg(String org) {
        this.org = org;
    }

    public void addToDetails(Details details) {
        this.details.add(details);
    }

    public List<Details> getDetails() {
        return details;
    }

    public void setDetails(List<Details> details) {
        this.details = details;
    }

    public String getRawData() {
        return rawData;
    }

    public void setRawData(String rawData) {
        this.rawData = rawData;
    }
}

class Details {
    private String name;
    private String address;

    public Details(
            String name,
            String address) {
        this.name = name;
        this.address = address;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }
}

如果您检查第13和16行,我只需要将org添加到组合响应一次,并且在此添加了检查,还需要将名称附加到rawData上。我的问题是,由于我正在使用并行流,因此它将如何运行。

我确信在线程并行的情况下,事情可能会中断。

我该如何处理这种情况?

0 个答案:

没有答案