0

I Operationen wieThema sichere Betrieb in einem Eintrag

class A { 
} 

ConcurrentHashMap<A, Integer> map = new ConcurrentHashMap<>(); 

public void fun() { 
    Integer count = map.get(Object); 
    if (count != null) { 
     map.put(Object, count+1); 
    } 
} 
public void add() { 
    // increase Object count by 1 
} 
public void remove() { 
    // deduct Object count by 1 
} 

tun wollen Wie kann ich Spaß() Thread-sicher zu machen?

weiß, dass ich einen Weg, dies zu tun ist

synchronisiert Block hinzufügen
public void fun() { 
    synchronized("") { 
     Integer count = map.get(Object); 
     if (count != null) { 
      map.put(Object, count+1); 
     } 
    } 
} 

Aber gibt es andere Möglichkeiten, es zu tun? Oder gibt es Bibliotheken dafür?

wie Thread-Safe-Entry-Prozessor?


Ich möchte auch so etwas wie

public void remove() { 
    int count = map.get(Object); 
    count -= 5; 
    if (count <= 0) { 
     map.remove(Object); 
    } else { 
     map.put(Object, count + 2); 
    } 
} 

Any ways to do this ? 
Thank you 
+0

Haben Sie http://StackOverflow.com/a/26214475/4764198 überprüft? – arkki

+1

In Ihrem Beispielcode kann die Synchronisation auf die leere Zeichenfolge abhängig vom Verhalten des Praktikums und des genauen Verwendungsmusters funktionieren oder nicht, aber es ist im Allgemeinen nicht üblich. Wenn Sie die Synchronisierung verwenden, sollten Sie entweder auf der Karte selbst oder auf einem dedizierten Objekt, aber nicht auf der leeren Zeichenfolge synchronisieren. – GPI

+0

Welche Java-Version verwenden Sie? Dies ist in Java 8 viel einfacher als in anderen Versionen. –

Antwort

-1

Verwenden AtomicInteger und ConcurrentHashMap.putIfAbsent()

Auch am ConcurrentHashMap.remove(key, value) aussehen implementieren - entfernt die Schlüssel nur dann, wenn es auf den angegebenen Wert zugeordnet wird.

Ich bin mir nicht sicher, ob es möglich ist, die exakte Logik zu implementieren (was in der obigen Frage nicht sehr gut definiert ist), aber diese Methoden könnten sehr nützlich sein, etwas ähnliches zu tun.

Weitere Hinweise (das nützlich sein könnte oder auch nicht zu viel sein):

Sie (wahrscheinlich!) Können Methoden verwenden: computeIfAbsent, computeIfPresent (oder ersetzen) und entfernen (Schlüssel, Wert). ConcurrentHashMap könnte für Werte definiert werden, die ganze Zahlen sind.

Es wird sehr schmutzig Lösung, und ich empfehle Ihnen nicht, es zu verwenden, aber als etwas zum Nachdenken, könnte es sehr herausfordernd sein.

Lassen Sie mich wissen, wenn Sie weitere Hinweise benötigen.

+0

Kannst du mir mehr darüber erzählen? Wie kann ich sie hier benutzen? Danke – Peng

+0

Das ist vollkommen in Ordnung für die 'fun()' Methode, aber für das Beispiel 'remove()' one, ist es für mich nicht offensichtlich, auch wenn das funktioniert. – GPI

+0

Sie können Benutzer entfernen (Schlüssel, Wert) – Slava