2015-06-22 3 views
5

J. Bloch nel suo Java efficace suggerisce di utilizzare un'implementazione singleton basata su enum. Per esempio:Implementazione di singleton enum-based

public enum Application { 

    INSTANCE; 

    //methods, fields 

} 

Questa implementazione è bello in caso di serializzazione perché enumerazioni ci forniscono la capacità di serializzazione di default (e noi non devono avere paura di avere due istanze diverse durante la deserializzazione dell'oggetto) .

La mia domanda è come questa implementazione rispetta il multhreading. Come renderlo thread-safe? Cosa otterremmo probabilmente se provassimo ad accedervi da diversi thread?

+0

Lo si rende thread-safe mentre si crea qualsiasi altro thread-safe: accertandosi che l'accesso al suo stato sia correttamente sincronizzato. Se non ha stato, è intrinsecamente thread-safe. –

+2

Il vantaggio di enum è che è inizializzato su thread-safe. Un altro modello singleton richiede che una classe interiore ottenga lo stesso risultato e sia più verboso/magico. –

risposta

8

Il comportamento effettivo enum di instaziare l'istanza doesn't have an issue with thread safety. Tuttavia, è necessario assicurarsi che lo stato dell'istanza stesso sia thread-safe.

Le interazioni con i campi e i metodi di Application sono il rischio: utilizzare un'attenta sincronizzazione e blocco, o dati puramente concomitanti e un'attenta verifica che altre incongruenze non possano accadere, sarà la soluzione migliore qui.

+0

Quindi devo ancora sincronizzare alcuni metodi dell'enum per garantire la sicurezza dei thread? –

+0

@ St.Antario Sì, poiché lo stato di avvolgimento in una enumerazione non è un "mirino magico" per la sicurezza dei thread. Trattalo come una classe che deve essere sicura per i thread, ma non preoccuparti della sicurezza del thread del costruttore (a parte la perdita di 'this'). – hexafraction

+1

Capito, grazie. –

1

Singleton garantisce di avere solo un'istanza di una classe per ogni programma di caricamento classi.

Devi solo occuparti della concorrenza se il tuo singleton ha uno stato mutabile. Voglio dire se Singleton persiste in qualche tipo di dati mutabili.

In questo caso è necessario utilizzare una sorta di meccanismo di blocco della sincronizzazione per impedire modifiche simultanee dello stato e/o utilizzare strutture di dati thread-safe.