View Single Post
Old 07-07-2011, 11:59   #6
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Quote:
Originariamente inviato da Satshas Guarda i messaggi
2)Un nuovo utente si registra/modifica i propri dati Login mentre il server è attivo, e quindi lo sono tutti i thread tra cui potrebbero esserci N>=0 ThreadSlotUtente che stanno effettuando il login, e qui ho appunto bisogno di lock esclusivo
In questo caso hai bisogno di sincronizzare due eventi distinti.
1) l'accesso alla singola istanza Login, a causa di potenziale mutazione concorrente da parte di un altro thread, il che capita quando un utente modifica i propri dati.

2) l'accesso all'array Login, a causa di potenziale mutazione concorrente da parte di un altro thread, il che capita quando un utente nuovo si registra (nuovo Login da aggiungere all'array e quindi nuovo array?)
A questo punto penso ti converrebbe usare un java.util.concurrent.CopyOnWriteArrayList al posto dell'array di Login: è perfetto per condividere una collezione sulla quale si eseguono molti accessi in lettura e pochi/rari accessi in scrittura. In particolare potresti usare l'iterator restituito da questa collezione, che rappresenta lo "snapshot" dello stato della stessa al momento della sua chiamata.
Devi poi comunque sincronizzare l'accesso al singolo Login, se può essere mutato da un'altro thread (punto 1)

Ma forse a questo punto ti converrebbe progettare una classe thread-safe che incapsuli tutto il sistema logico di login (creazioneUtente - modificaUtente - cancellaUtente - utenteRegistrato) al suo interno ed esponga metodi ad-hoc per le varie operazioni.

Quote:
Originariamente inviato da Satshas Guarda i messaggi
Comunque ritornando IT sul discorso reference e tralasciando altre scelte implementative in cui potrei evitare di pormi la domanda, io passo al costruttore dei ThreadSlotUtente e copio su un riferimento locale l'array Login che nel frattempo può essere letto e/o modificato da altri ThreadSlotUtente o dal thread che si occupa delle registrazioni.
E' confermato che ciò, o che il concetto in generale dato che può tornare utile, è thread-safe?
Non ho capito cosa intendi con "...e copio su un riferimento locale l'array Login": esegui un semplice assegnamento di reference o crei un nuovo array locale in cui copi gli elementi del Login[] globale?

Ripeto che forse ti faciliti la vita creandoti una classe ad-hoc, come sopra.
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)
banryu79 è offline   Rispondi citando il messaggio o parte di esso