Salve a tutti ragazzi.. Sto realizzando un piccolo progetto per l'università che consiste di un banale sistema di ecommerce client/server che non utilizza database ma salva il tutto su file e gestisce in modo sincronizzato le transazioni sugli oggetti ma permette anche l'accesso concorrente se si tratta di oggetti diversi.. La prima cosa che ho pensato di fare è usare un hashtable (che poi serializzerò su file per salvare i dati) che ad ogni chiave associa un oggetto prodotto da me creato che contiene i metodi per le operazioni di vendita che vanno a modificare le quantità. Tali metodi chiaramente definiti synchronized. Così mi sembrava a primo acchitto di poter risolvere tutti i miei problemi.. Infatti, a meno che non dico grandi cavolate, in questo modo dovrebbero sincronizzarsi i singoli oggetti prodotto...
Ora viene il bello.. Ciò che ignoravo, non conoscendo benissimo l'hashtable, è che non esiste una cosa di questo tipo per accedere direttamente agli oggetti contenuti al suo interno:
(Prodotto)h[chiave].metodo_mio_oggetto..
E quindi dovrei fare una cosa del genere:
Prodotto p = (Prodotto)h.get(chiave);
p.metodo_mio_oggetto;
p.add(chiave,p);
Ma così tutta la mia bella sincronizzazione è vana.. perchè se un thread arriva fino alla seconda riga di questo codice, viene messo in attesa, un altro riesce ad eseguire tutte e tre le righe.. quando il primo thread continua l'esecuzione mi sovrascrive tutto.. Ma non posso nemmeno mettere il blocco synchronized lì intorno perchè dovrei toglierlo dall'oggetto prodotto ma soprattutto così farei un lock su tutto l'hashtable.. e non sui singoli prodotti...
Come potrei risolvere questo arcano ? Cosa mi consigliate ? Cambiare contenitore ? L'hashtable per me era appetibile per il semplice fatto della ricerca in O(1).. Dato che ogni volta che un client modifica o compra un prodotto devo notificarlo a tutti gli altri client, ogni volta dovrei fargli scorrere un ipotetico vettore o array che sia per ritrovare gli oggetti modificati ed aggiornarli e non mi sembra una cosa molto efficiente..
Grazie mille in anticipo..
PS:Vedendo le differenze tra hashtable e hashmap ho visto che sostanzialmente l'hashtable è sincronizzato e l'hashmap no.. ma che vantaggi mi porta il fatto che sia già sincronizzato se poi le operazioni di modifica non posso farle direttamente ?

Rispondi quotando