Visualizzazione dei risultati da 1 a 3 su 3

Hybrid View

  1. #1

    ConcurrentHashMap e synchronized, ha senso?

    Salve,

    avendo una ConcurrentHashMap, ha senso unsare synchronized per eseguirci sopra una serie di operazioni? Nel senso:

    codice:
    class MyClass{
    
       private Map< String, Object > map = new ConcurrentHashMap<>();
    
    ....
    
       public void add(String key, Object value)
       {
             synchronized(map)
             {
                  //qualche if sulla map
                  //qualche valorizzazione di Object e della mappa
                  
                  map.put/key,value);
             } 
    
       }
    ...
    }
    usando la mappa anche come un semaforo praticamente

    Grazie
    Ultima modifica di Santino83_02; 26-09-2015 a 18:06
    IP-PBX management: http://www.easypbx.it

    Old account: 2126 messages
    Oldest account: 3559 messages

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Santino83_02 Visualizza il messaggio
    avendo una ConcurrentHashMap, ha senso unsare synchronized per eseguirci sopra una serie di operazioni?
    ConcurrentHashMap non acquisisce il lock sul this (ovvero sulla istanza del ConcurrentHashMap), come invece fanno es. Vector e Hashtable.
    In Vector/Hashtable i loro metodi acquisiscono il lock sul this e quindi se tu sfrutti la tecnica del "client-side locking" e acquisisci il lock sulla istanza della collezione con un synchronized(obj) (per fare tipicamente operazioni "composte" tipo: leggi .. fai qualcosa ... scrivi) allora hai la garanzia della "atomicità" e anche che nessun altro thread può compiere operazioni direttamente sulla collezione, visto che il lock usato dalla collezione è lo stesso che usi tu.

    Con ConcurrentHashMap non è così, i lock sono interni, nascosti, e ce n'è più di uno (fino a Java 7 la implementazione di ConcurrentHashMap usava la tecnica del "lock striping" mentre in Java 8 se non sbaglio la implementazione è cambiata abbastanza radicalmente).

    In sostanza con ConcurrentHashMap la tecnica del client-side locking NON funziona in generale per fare operazioni "composte". Proprio per questo motivo in ConcurrentHashMap hanno aggiunto operazioni tipo putIfAbsent e il remove(Object key, Object value) (e i due replace) perché con il client-side locking non sarebbero possibili in modo safe.

    Se tu in tutti (e ripeto tutti) i punti dove usi quell'oggetto ConcurrentHashMap sfrutti il client-side locking e acquisisci il lock sulla mappa, allora può funzionare perché in sostanza stai imponendo tu un "protocollo" di sincronizzazione ben preciso e che deve appunto essere consistente e comune. Solo che se fai così ... imponi una forte "serializzazione" degli accessi alla mappa e quindi tutti i benefici della alta concorrenza di ConcurrentHashMap vanno a farsi friggere ....

    Morale della favola: rivedi bene il tutto (alla luce di quanto ho detto).
    Ultima modifica di andbin; 26-09-2015 a 20:54
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Sei stato fin troppo esaustivo, grazie mille tutto chiaro!
    IP-PBX management: http://www.easypbx.it

    Old account: 2126 messages
    Oldest account: 3559 messages

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.