Thread lock

di il
4 risposte

Thread lock

Ciao a tutti, ho un problema con i thread. Sto realizzando dei thread che hanno il compito di fare richiesta della stessa key presente in una treemap ma attraverso un lock devo in maniera sequenziale mettere in sleep un thread e lasciare che il thread che possiede la precedenza sulla key termini. Il punto della questione è che sulla base di questa treemap come faccio ad identificarmi una sola chiave da bloccare, spero di esser stato chiaro. Grazie !

4 Risposte

  • Re: Thread lock

    clp ha scritto:


    Ciao a tutti, ho un problema con i thread. Sto realizzando dei thread che hanno il compito di fare richiesta della stessa key presente in una treemap ma attraverso un lock devo in maniera sequenziale mettere in sleep un thread e lasciare che il thread che possiede la precedenza sulla key termini. Il punto della questione è che sulla base di questa treemap come faccio ad identificarmi una sola chiave da bloccare, spero di esser stato chiaro. Grazie !
    Cosa sono chiave e valore?
    Cosa intendi per "sequenziale"? Se intendi usare il "monitor" intrinseco degli oggetti, sappi che l'ordine di acquisizione NON segue l'ordine di richiesta di un lock.
    Cosa intendi per "che possiede la precedenza"? Semplicemente quello che ha il lock in quel momento o c'è dell'altro come criterio?
  • Re: Thread lock

    TUTTO SBAGLIATO!

    Se hai usato TreeMap o HashMap, le strutture dato NON SONO thread-safe, cioe' si scassano se due tread distinti tentano di modificarle contemporaneamente ANCHE se metti un lock A LIVELLO DI chiave.

    Devi usare un lock A LIVELLO DI INTERA STRUTTURA dati.

    Questo implica che la sleep NON SERVE, e se ti serve, allora vuol dire che hai SBAGLIATO COMPLETAMENTE implementazione.

    ALtro discorso se vuoi avere PIU' thread che leggono contemporaneamente. MA IN OGNI CASO UN SOLO thread alla volta puo' modificare la mappa.

    In questo caso puoi usare un Read/Write Lock.

    In altri termini, non ti e' minimamente chiaro come funzionano i thread e come si usano i lock.

    STUDIA DI PIU'
  • Re: Thread lock

    Se ho chiesto è proprio per questo motivo... non per farmelo dire da te.. evidentemente è perchè non sono riuscito a dare una risposta alla mia domanda. comunque un solo thread alla volta deve poter fare il lock questo mi sembrava chiaro.
  • Re: Thread lock

    @clp: ieri sera prima di uscire dall'ufficio avrei voluto scriverti io praticamente le stesse cose ... magari solo un pochino più gentilmente. Ma poi non ne ho avuto tempo.

    Il problema spero ti sia ben chiaro: HashMap, TreeMap e altre collezioni non sincronizzate, NON sono thread safe. Se vuoi usarle in modo concorrente, l'accesso allora va protetto con un lock. Se si usa il lock intrinseco di un oggetto si ha una "serializzazione" totale degli accessi (un solo thread per volta, indipendentemente da cosa voglia fare se lettura o modifica).
    Si può fare di meglio con un lock "esplicito" (fornito dal framework) che fornisce "spezzati" i lock di lettura e di scrittura. Più thread possono accedere insieme in lettura ma la scrittura è comunque ancora esclusiva.

    Detto questo, non è chiaro il motivo della tua richiesta iniziale. Per scopi "didattici"? Per altro? Il locking per chiave, forse hai capito, ha poco senso se "sotto" c'è la necessità di esclusività in scrittura. Potrebbe avere un pelino più senso solo se mi dicessi che vuoi proteggere e rendere "atomiche" delle operazioni di read-modify-write su una certa chiave, che andrebbero fatte in modo concettualmente similare al compute() di ConcurrentHashMap.
Devi accedere o registrarti per scrivere nel forum
4 risposte