Salve a tutti!

il mio dubbio forse è dovuto ad un po di confusione dovuta all'overdose di codice che ho fatto oggi..

Ho una classe che gestisce una HashMap.
Questo oggetto è condiviso da "N" thread, i quali possono chiamare i metodi di put, remove, e, metodi di lettura, che dopo piccole operazioni di contorno eseguono l'equivalente sulla HashMap.

La concorreza impone impone di "Sincronizzare" l'accesso a tali metodi.

Il mio dubbio e su oprezaioni del tipo
codice:
containsKey(key)
get(key)
Sono operazioni di lettura che non sono sicuro ci sia la necessità di sincronizzare..
codice:
public MyClass(){
    private HashMap map = new HashMap();

    public synchronized void removeKey(String key){
        map.remove(key);
    }
 
    public synchronized void addElem(String key, String elem){
        if(!map.containsKey(key))
               map.put(elem);
    }

   oppure:
    public void addElem(String key, String elem){
        if(!map.containsKey(key))
             syncronized(this){
                 map.put(elem);
              }
           }
}
Nel secondo caso, sincronizzo solo il "put" mntre permetto a tutti l'esecuzione di containsKey()...