PDA

View Full Version : [JAVA] Versione synchronized di una classe


andbin
14-12-2006, 17:03
Ho una classe che ho sviluppato io, è una specie di collezione particolare, al suo interno utilizza 2 HashMap. Nessuno dei metodi che ho creato è marcato synchronized, quindi così com'è non è adatta per un uso "concorrente".

Vorrei dare la possibilità di ottenere una versione synchronized della mia classe. Quale è la soluzione migliore??

Io ho pensato questo: nella classe metto una classe innestata 'static' che estende la classe. In questa classe innestata faccio l'override di ogni metodo marcandolo synchronized e facendo in modo che chiami semplicemente super.metodo(...). Poi metto un metodo nella mia classe che ritorna una istanza della classe synchronized.

Vi sembra una buona idea? Altre possibili soluzioni?

Sono anche andato a vedere il sorgente della classe java.util.Collections e ho visto che per ottenere una collezione synchronized fa in un altro modo: ha una classe innestata 'static' che incapsula una Collection e un Object che fa da mutex. Ogni metodo definito fa il synchronized sul mutex e chiama il relativo metodo.

Grazie in anticipo.

PGI-Bis
15-12-2006, 12:10
Parlando di istanze, tra estensione (quello che proponi) e adattatore (quello di Collections) non cambia nulla. Cioè se quello che ti serve è un'istanza di MyCollection "sincronizzata" allora entrambe le soluzioni producono lo stesso risultato e la scelta è una questione di preferenze personali. Personalmente ritengo che l'estensione sia preferibile perchè ti risparmia la perplessità di decidere se l'adattatore debba o non debba essere "uguale" (equals e hashCode) all'adattato.

Cambia qualcosa se ti serva lavorare non solo con le istanze "sincronizzate" ma anche con i tipi di quelle istanze. In pratica se vuoi creare delle estensioni della versione sincronizzata del tuo insieme. In questo caso un adattatore ti offre la possibilità di accedere all'eredità multipla, eventualmente iniettando un'interfaccia nella gerarchia dei tipi, che non altera la compatibilità binaria delle classi.

La scelta di usare un campo Object come mutex è difensiva. Usando metodi synchronized o blocchi sincronizzati su this la mutua esclusione avviene su una risorsa contendibile da altri Thread il che può causare stalli, se qualcuno, bizzarramente, decida di usare quell'istanza come struttura di sincronizzazione.