Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2010
    Messaggi
    5

    [JAVA] Chat multithreading Sincronizzazione

    Innanzitutto salve a tutti, questo è il mio primo messaggio, spero di riuscire a trovare qualche consiglio.

    Spiego il problema:

    Ho realizzato una chat in codice java ovviamente con piu thread che vanno a lavorare su dei dati comuni, quali una lista di utenti che viene aggiornata eliminando e aggiungendo elementi o semplicemente ritornando la lista.


    codice:
    public class Sync{ 	
    LinkedList<Utente> listaUtenti;    	
    public Sync(LinkedList<Utente> lu) { 		
        listaUtenti=lu; 	
    } //costruttore   	
    
    //UTENTI  	
    
    public LinkedList<Utente> getLista(){ 		
    return listaUtenti; 	
    }  	
    public void EliminaUtente(Utente u){ 		
    listaUtenti.remove(u); 	
    } 	
    public void AggiungiUtente(Utente u){ 		
    listaUtenti.add(u); 	
    } 	
    public Utente getUtente(int i){ 		
    return listaUtenti.get(i); 	
    }
    Mi chiedevo se bastesse usare synchronized e come poterlo usare, o se usare semafori.

    Se uso synchronized per ogni classe credo non vada bene perchè da come ho capito se un utente impegna il metodo per aggiungere o eliminare un utente, comunque puo essere usato il metodo per leggere gli utenti e questo creerebbe inconsistenza.
    Quindi ho pensato, se fosse possibile, render tutta la classe synchronized, ma questo rallenterebbe un pochetto l'accesso.

    Ringrazio in anticipo per l'aiuto!

  2. #2

    Lista sincronizzata

    Basta utilizzare il seguente metodo per rendere la lista sincorized:


    Collections. synchronizedList(listaUtenti);


    e ricordati di includere la parola syncronized sui set e get del bean Utente



    Ciao spero di esserti stato di aiuto.

  3. #3
    Utente di HTML.it
    Registrato dal
    Nov 2010
    Messaggi
    5
    Ma non ho ben capito come funziona, quindi mi basta fare

    Collections.synchronizedList(listaUtenti);

    e usare synchronized con i vari metodi per garantire mutua esclusione.
    Pensavo in questo modo si garantisse solo ai singoli metodi cioè che mentre un utente prende il lock in lettura un altro utente puo entrare a scrivere.

    Grazie mille per la risposta!

  4. #4
    Utente di HTML.it
    Registrato dal
    Nov 2010
    Messaggi
    5
    codice:
    package server; 
     import java.util.LinkedList; 
     public class SincLista{ 
    	LinkedList lista; 
     	public SincLista(LinkedList lista) { 	
    	this.lista = lista; 	
    } //costruttore  	
    public synchronized LinkedList getLista(){ 
    		return lista; 	
    } 	
    public synchronized int getListaSize(){ 	
    	return lista.size(); 	
    } 	
    public synchronized void EliminaUtente(Utente u){ 	
    	lista.remove(u); 	
    } 	
    public synchronized void AggiungiUtente(Utente u){ 	
    	lista.add(u); 	
    } 	
    public synchronized void EliminaStanza(Stanza s){ 	
    	lista.remove(s); 	
    } 	
    public synchronized void AggiungiStanza(Stanza s){ 		
    lista.add(s); 	
    } 	public Object getElemento(int i){ 		
    return lista.get(i); 	
    }  
    
    }

    Qualcuno mi sa consigliare se in questo modo c'è mutua esclusione?

    Credo che qualcosa non sia corretto ma non so cosa perchè mi da questo warning:

    uses unchecked or unsafe operations.

  5. #5
    Il warning te lo da perchè utilizzi LinkedList senza parametrizzarlo. Dovresti utilizzarlo in maniera simile

    codice:
    LinkedList<Utente> lista; 
    
    public SincLista(LinkedList<Utente> lista) {   
       this.lista = lista;  
    }
    Un'altra cosa. Sicuro di voler utilizzare la stessa lista sia per gli utenti che per le stanze della chat? Non sarebbe meglio tenere separate le due collezioni? Tipo così:

    codice:
    LinkedList<Utente> listaUtenti;
    LinkedList<Stanza> listaStanze;
    L'esempio che hai postato garantisce la mutua esclusione sui singoli metodi.
    Personalmente, comunque, mi aiuta chiedermi "cosa possono fare due utenti contemporaneamente senza che si pestino i piedi?". Ad esempio, getLista (o meglio, per come la vedo io getListaUtenti) non dovrebbe essere sincronizzata, perchè la lettura simultanea non dovrebbe crearti problemi, anzi ti evita che il secondo aspetti il primo.


  6. #6
    Utente di HTML.it
    Registrato dal
    Nov 2010
    Messaggi
    5
    A quindi in questo modo la mutua esclusione è sui singoli metodi quindi se un utente sta utilizzando un metodo per leggere nel frattempo un altro utente puo usare un altro metodo per scrivere?

    Come posso evitare questo?

    Grazie!

  7. #7
    Puoi utilizzare un lock. Qui c'è un esempio:

    Lock

    Se utilizzi lock1 della pagina linkata sia per la lettura che per la scrittura, metti in mutua esclusione le operazioni.


Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.