Целостность данных при использовании параллельного потока - PullRequest
0 голосов
/ 22 апреля 2019

У меня есть реализованное ниже, и я еще не тестировал его с большим количеством данных.

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. Мой вопрос заключается в том, что, поскольку я использую параллельный поток, как бы он себя вел?

Я уверен, что может быть сценарий, когда параллельные потоки могут сломаться.

Как я могу пойти дальше и справиться с этим сценарием?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...