Wie stellen Sie die Aktualisierung BigDecimal innerhalb ConcurrentHashMap thread-sichere

Ich versuche eine Anwendung, die dauert ein paar journal-Einträge und die Summe berechnen.

Ist unten Weg, es zu tun ist thread/concurrency sicher, wenn es mehrere threads Aufruf der addToSum() Methode. Ich möchte sicherstellen, dass jeder Aufruf aktualisiert das total richtig.

Wenn es nicht sicher ist, erklären Sie bitte, was muss ich tun, um thread-Sicherheit gewährleisten.

Muss ich synchronize den get/put-oder gibt es eine bessere Möglichkeit?

private ConcurrentHashMap<String, BigDecimal> sumByAccount;

public void addToSum(String account, BigDecimal amount){
    BigDecimal newSum = sumByAccount.get(account).add(amount);
    sumByAccount.put(account, newSum);
}

Vielen Dank!

Update:

Danke an alle für die Antwort habe ich bereits bekommen, dass der code oben ist nicht thread-safe.

Dank Vint für die Annahme, die AtomicReference als alternative zu synchronize. Ich war mit AtomicInteger zu halten, integer Summen vor, und ich Frage mich, ob es so etwas wie, dass für BigDecimal.

Ist das eine definitive Schlussfolgerung über das pro und Contra von beiden?

InformationsquelleAutor Desmond Zhou | 2011-12-19
Schreibe einen Kommentar