Come rendere un metodo sincronizzato su tutte le istanze di una classe

5

Oggi mi è stata fatta questa domanda dell'intervista e non ho potuto rispondere. Se hai due istanze di una classe Person che ha un metodo setAddress che è sincronizzato. Ora se era un solo oggetto e più thread vi stavano accedendo, il synchronized si assicurerà che solo un metodo possa accedervi alla volta.

Ma se ci sono oggetti diversi, un thread non attenderà l'altro prima di entrare nel metodo.

Ora la domanda è ... se volessi rendere sincronizzato il metodo tra tutte le istanze di Person Objects, come faccio?

    
posta Kaushik 01.08.2013 - 00:07
fonte

2 risposte

10

Sincronizza su Person.class o crea un oggetto LOCK statico su cui sincronizzi:

synchronize(Person.class){
    //...
}

o

private static final Object LOCK = new Object();

//...
synchronize(LOCK){
    //...
}

In entrambi i casi, stiamo usando una singola istanza di oggetto di blocco (statico) comune a tutti i chiamanti. La sincronizzazione sulla classe rispecchia il comportamento predefinito dei metodi static sincronizzati. Ma in qualche modo espone il blocco, che può essere pericoloso perché, ad esempio, un codice malvagio potrebbe sincronizzarsi su Person.class e non rilasciare mai il blocco e rendere il codice inceppato. Mantenere un blocco privato separato è quindi più sicuro.

    
risposta data 01.08.2013 - 00:17
fonte
0

Rendi statico il metodo setAddress () insieme a sincronizzato. Fondamentalmente, dovresti rendere globale il metodo setAddress () in modo che esista solo una copia di questo metodo e rendendo sincronizzato solo un thread sta entrando in questo metodo.

public static static void setAddress () {     // ... }

C'è un inconveniente: tutte le variabili di istanza dovranno essere rese statiche. Come solo le variabili statiche sono accessibili dal metodo statico.

    
risposta data 11.09.2016 - 06:05
fonte

Leggi altre domande sui tag