Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2008
    Messaggi
    140

    sincronizzare accesso a una lista

    ciao a tutti,
    volevo chiedere un'informazione.
    ho dichiarato una list
    public static List<Scontrino> coda=new ArrayList<Scontrino>();
    ho una thread che controlla continuamente se è stato aggiunto qualcosa nella coda, se si los tampa e lo rimuove.

    un altro thread aggiunge le cose da stampare.

    ho visto che con la list quando rimuovo un oggetto le posizioni si aggiornano da sole, e l'add aggiunge gli elementi alla fine (in coda).

    io il thread che stampa e cancella l elemento lo faccio accedere sempre alla prima posizione della coda, faccio rimuovi e ecco che scorrono gli elementi, ristampa ecc...

    domanda: devo fare accedere i thread in modo sincronizzato? l'aggiungi e il remove devo metterli synchronized?

    grazie

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: sincronizzare accesso a una lista

    Originariamente inviato da Aleb
    ho una thread che controlla continuamente se è stato aggiunto qualcosa nella coda, se si los tampa e lo rimuove.

    domanda: devo fare accedere i thread in modo sincronizzato?
    Innanzitutto si deduce che hai un sistema produttore-consumatore. Un thread produce elementi che inserisce e un altro li estrae per consumarli. Pertanto un ArrayList non è effettivamente il più appropriato.
    Anche perché il thread "consumatore" sarebbe sempre in "loop" per verificare se c'è qualcosa e questo è poco bello e inefficiente. Il thread consumatore potrebbe anche stare benissimo in "wait" e svegliarsi solo quando c'è un elemento. E questo si può fare ma non con ArrayList.

    Se usi almeno Java 5, allora vedi java.util.concurrent.ArrayBlockingQueue o java.util.concurrent.LinkedBlockingQueue. Devi solo stabilire se la coda la vuoi "bounded" (con un limite massimo) o no. E non dovresti pensare tu alla sincronizzazione. Queste queue sono già pensate per un uso "concorrente".
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Jan 2008
    Messaggi
    140
    grazie mille ora provo

  4. #4
    Utente di HTML.it
    Registrato dal
    Jan 2008
    Messaggi
    140
    ciao andbin ho fatto così e funziona ma volevo sapere se magari ho usato un modo troppo contorto


    ho creato una classe CodaStampa in cui metto
    BlockingQueue queue=new LinkedBlockingQueue<Scontrino>();
    il costruttore di questa classe mi chiama il thread consumatore, dove ho messo un while(true) e all'interno il recuperto dell'oggetto dalla coda con queue.take(), poi tutto quello che deve fare con l'oggetto recuperato.

    ho più dubbi per il produttore, praticamente mi si crea un thread per ogni client che si connette al server e nelle varie cose che fa questo thread ho messo queue.put(oggetto).

    ho sbagliato?

    praticamente quando faccio put o take il thread si prende il "lock" sulla risorsa. ho capito bene o non ho capito niente? grazie

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.