Questa domanda riguarda le raccolte Java, in particolare Hashtable e Vector, ma può essere applicata anche altrove.Programmazione di interfacce e raccolte sincronizzate
Ho letto in molti punti quanto sia bello programmare le interfacce e sono d'accordo al 100%. La possibilità di programmare un'interfaccia List, ad esempio, senza riguardo per l'implementazione sottostante è sicuramente utile per il disaccoppiamento e il test. Con le collezioni, posso vedere come una ArrayList e una LinkedList sono applicabili in diverse circostanze, date le differenze rispetto alla struttura di archiviazione interna, ai tempi di accesso casuale, ecc. Tuttavia, queste due implementazioni possono essere utilizzate con la stessa interfaccia ... che è grande.
Quello che non riesco a collocare è il modo in cui certe implementazioni sincronizzate (in particolare Hashtable e Vector) si adattano a queste interfacce. Per me, non sembrano adattarsi al modello. La maggior parte delle implementazioni della struttura dati sottostante sembrano variare nel modo in cui i dati vengono archiviati (LinkedList, Array, albero ordinato, ecc.), Mentre la sincronizzazione si occupa delle condizioni (condizioni di blocco) alle quali è possibile accedere ai dati. Diamo un'occhiata a un esempio in cui un metodo restituisce un insieme Mappa:
public Map<String, String> getSomeData();
Supponiamo che l'applicazione non è interessata a tutti con la concorrenza. In questo caso, operiamo su qualunque implementazione il metodo ritorni tramite l'interfaccia ... Tutti sono felici. Il mondo è stabile
Tuttavia, cosa succede se l'applicazione richiede ora attenzione sul fronte della concorrenza? Ora non possiamo operare senza riguardo per l'implementazione sottostante - Hashtable andrebbe bene, ma altre implementazioni devono essere soddisfatte. Consideriamo 3 scenari:
1) Applicare la sincronizzazione utilizzando i blocchi di sincronizzazione, ecc. Quando si aggiunge/rimuove con la raccolta. Questo non sarebbe tuttavia eccessivo nel caso in cui un'implementazione sincronizzata (Hashtable) venga restituita?
2) Modificare la firma del metodo per restituire Hashtable. Questo, tuttavia, ci vincola strettamente all'implementazione di Hashtable e, di conseguenza, i vantaggi della programmazione su un'interfaccia vengono lanciati fuori dalla finestra.
3) Utilizzare il pacchetto simultaneo e modificare la firma del metodo per restituire un'implementazione dell'interfaccia ConcurrentMap. Per me, questa sembra la via da seguire.
In sostanza, sembra proprio che alcune implementazioni sincronizzate siano un po 'inadeguate all'interno del framework delle collezioni in quanto, quando si programma alle interfacce, il problema della sincronizzazione quasi obbliga a pensare all'implementazione sottostante.
Mi manca completamente il punto qui?
Grazie.
Penso che la chiave è che l'aggiunta di alcune parole chiave 'sincronizzate' qui o là non rende il programma sicuro per i thread. Anche con le raccolte 'java.util.concurrent', si desidera mantenerle come dettagli di implementazione privati. –