У меня есть 2 параллельные структуры данных, и я хочу обновить их атомарно - PullRequest
1 голос
/ 28 января 2020

Как сделать так, чтобы эти два параллельных оператора структуры данных выполнялись как блок atomi c без использования оператора synchronized, чтобы сумма была согласованной в любой заданный момент времени?

Примечание : Я новичок в многопоточности java.

AtomicLong sumOfAllItems=new AtomicLong();
AtomicLong itemSpecificSum=new AtomicLong();

public void addPrice(long price){
    // how to make sure that these two statements get executed 
    // with synchronised() block

    sumOfAllItems.addAndGet(price);
    itemSpecificSum.addAndGet(price);
}

1 Ответ

1 голос
/ 29 января 2020

Измените свой метод с этого:

public void addPrice(long price) {
    // ...    
}

на этот:

public synchronized void addPrice(long price) {
    // ...    
}

При назначении метода как sychronized, JVM не позволит более одного потока одновременно для выполнения этого метода.

Существуют и другие способы написания потокобезопасного кода, но если и до тех пор, пока у вас нет конкретной причины c, чтобы использовать их, используйте синхронизированный класс - это здорово просто, правильно и легко понять / рассуждать о.

...