2016-07-20 7 views
0

In diesem Beitrag: Can we use Synchronized for each entry instead of ConcurrentHashMap?Locking Wert Objekte eines ConcurrentHashMap

ich gefragt, ob wir Synchronized Block verwenden können nur Einträge einer HashMap zu sperren, die ich gelernt, können wir nicht. Nun, meine Frage ist, wenn ich eine ConcurrentHashMap (nicht hashMap) mit Werten vom Typ ArrayList oder TreeMap habe, kann ich diesen Ansatz (mit synchronisiert) verwenden. Hier, was ich meine:

ConcurrentHashMap<String, ArrayList<String>> map = new ConcurrentHashMap<>(); 




    synchronized (map.get("key")) { 
     //do something with the array thread-safely, 

    } 

Ist es sicher? Der Grund, warum ich frage, ist, dass ich nicht weiß, wie man diese Art von Problemen durch Testen prüft.

+0

_Ist es sicher? _ Ist nicht zu verantworten, es sei denn, wir wissen, was Sie sonst noch mit den Werten machen könnten. Ist ein anderer Teil Ihres Codes separat verwendet? Verriegeln sie sich vor dem Zugriff auf den entsprechenden Monitor? –

+0

Sie haben Recht. Ich meine, ist es thread-sicher, wenn wann immer ich auf die Arraylist zugreifen möchte, benutze synchronisierten Block? –

Antwort

0

Solange Sie die putIfAbsent Operation verwenden, ist es Thread-sicher. Sie werden immer auf die gleiche Objektreferenz synchronisiert (blockiert).

+0

Warum brauche ich PutIfAbsent? –

+0

Angenommen, Sie rufen 'map.put (" key ", new Object());' von vielen Threads gleichzeitig auf. Jeder Thread kann erfolgreich ausgeführt werden, sodass Sie mehrere Objekte synchronisieren können. Wenn Sie stattdessen 'putIfAbsent (" key ", new Object()) verwenden, wird nur ein Thread erfolgreich sein und Sie werden für dieses einzelne Objekt synchronisieren. –