Domanda

Qual è la differenza tra una Collections.synchronizedMap () e un involucro intorno un HashMap con tutti i metodi sincronizzati. Non vedo alcuna differenza becuase Collections.synchronizedMap () gestisce internamente lo stesso blocco per tutti i metodi.

In sostanza, qual è la differenza tra i seguenti frammenti di codice

Class C {    
    Object o;

    public void foo() {
       synchronized(o) {
           // thread safe code here
       }
    }
}

e

Class C {
    Object o;

    public synchronized void foo() {

    }
}
È stato utile?

Soluzione

C'è solo una differenza:

Collections.synchronizedMap è in grado di utilizzare un monitor diverso da sé.

Utilizzando metodi sincronizzati è lo stesso che utilizza sychnchonized(this)-blocchi, il che significa, l'involucro sarebbe il monitor e potrebbe essere bloccato dall'esterno dell'involucro.

Se non vuole un programma esterno per bloccare il monitor, è necessario nasconderlo.

D'altra parte, se si desidera chiamare più metodi in modo thread-safe, è il modo più semplice per bloccare l'intera collezione (ma non è molto scalabile, in effetti).

Ps:. Per il riutilizzo, è meglio delegare il metodo chiama a un backup-Map che per sostituire la classe, perché si può passare ad un'altra implementazione Mappa tardi, senza cambiare il tuo involucro

Altri suggerimenti

Entrambi gli approcci acquisiscono un monitor per l'oggetto e così dovrebbero eseguire esattamente lo stesso. La ragione principale per la differenza è di architettura. L'involucro sincrona permette estende il non-thread variazione sicuro base facilmente.

Detto che non utilizzano né, utilizzare ConcurrentHashMap. Esso utilizza striatura serratura quindi è molto più veloce da utilizzare, che approccio (come sono uguali in termini di overhead + contesa). striatura serratura permette segmenti della matrice di supporto per essere bloccati in modo indipendente. Questo significa che è meno probabile che due thread richiederanno di acquisire lo stesso blocco.

Non reinventare la ruota e utilizzare quanto previsto dalle API.

Si dovrebbe sempre decorare piuttosto che lumping tutto e tutti Feartures in un unico grande classe di primo piano.

Sempre prendere la pianura Mappa e decorare con collezioni o utilizzare un java.util.concurrent e utilizzare un vero e proprio blocco, così si può atomicamente controllare e aggiornare la mappa. Domani si potrebbe desiderare di cambiare il Hashtable per un Treemap e vi sarà nei guai se il vostro bloccato con una tabella hash.

Allora, perché me lo chiedi? :) Credi davvero che se la classe è collocato in package java.util poi alcuni magia accade e il suo codice Java funziona in qualche modo ingannevole?

E 'davvero solo avvolge tutti i metodi con sincronizzato {} blocco e niente di più.

UPD: la differenza è che hai molto meno probabilità di fare un errore se un utilizzo sincronizzato raccolta invece di fare tutte le cose di sincronizzazione da soli

.

UPD 2: come si può vedere nelle fonti usano 'mutex'-oggetto come monitor. Quando si utilizza il modificatore sincronizzati in firma del metodo (cioè synchronized void doSmth()) istanza corrente del vostro oggetto (vale a dire this) è usato come un monitor. Due blocchi di codice di seguito sono gli stessi:

1.

synchronized public void doSmth () {
   someLogic ();
   moreLogic ();
}

synchronized public static void doSmthStatic () {
   someStaticLogic ();
   moreStaticLogic ();
}

2.

public void doSmth () {
   synchronized (this) {
      someLogic ();
      moreLogic ();
   }
}

public static void doSmthStatic () {
   synchronized (ClassName.class) {
      someStaticLogic ();
      moreStaticLogic ();
   }
}

Se la sicurezza del filo non è il caso, strutture dati pacchetto utilizzo concorrenza. Utilizzando la classe wrapper ridurrà tutti gli accessi alla mappa in una coda sequenziale.

a) thread in attesa di fare operazioni a totalmente diversi punti della mappa sarà in attesa per lo stesso blocco. Sulla base del numero di thread questo può influenzare le prestazioni delle applicazioni.

b) Prendere in considerazione operazioni composite sulla mappa. Utilizzo di un involucro con un blocco unico non sarà di aiuto. Per esempio. "Guarda se presente quindi aggiungere" tipo di operazioni. sincronizzazione Discussione tornerà ad essere un problema.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top