Visualizzazione dei risultati da 1 a 4 su 4

Discussione: Condition-Lock

  1. #1

    Condition-Lock

    Ciao a tutti ,piccola-grande domanda: E' da poco che ho iniziato a lavorare con i thread; il prof ci ha detto di usare il lock esplicito ed io ho qualche problemino ad impostare gli esercizi utilizzando le variabili Condition.Non ho capito a pieno a che cosa servono e ---> non riesco a capire come faccio a stabilire il numero di queste variabili da utilizzare, per sincronizzare le operazioni da parte dei thread su una determinata risorsa... Cioè qual'è la domanda da porsi per stabilire quante variabli del genere servono??

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

    Re: Condition-Lock

    Originariamente inviato da valeriAsus
    Ciao a tutti ,piccola-grande domanda: E' da poco che ho iniziato a lavorare con i thread; il prof ci ha detto di usare il lock esplicito ed io ho qualche problemino ad impostare gli esercizi utilizzando le variabili Condition.Non ho capito a pieno a che cosa servono e ---> non riesco a capire come faccio a stabilire il numero di queste variabili da utilizzare, per sincronizzare le operazioni da parte dei thread su una determinata risorsa... Cioè qual'è la domanda da porsi per stabilire quante variabli del genere servono??
    I lock "espliciti" sono rappresentati dalla interfaccia java.util.concurrent.locks.Lock la cui implementazione principale è ReentrantLock (nel javadoc di questa classe c'è anche la spiegazione/esempio su come usarlo).
    ReentrantLock fornisce di base la stessa semantica che il lock "intrinseco" di un oggetto fornisce (cioè la mutua esclusione e la "visibilità" delle modifiche) ma offre anche altro di più. Innanzitutto l'attesa della acquisizione di un lock esplicito può essere interrotta (per quello intrinseco no) e poi comunque permette la gestione di lock all'interno di codice non strutturato a "blocco" (per quello intrinseco l'acquisizione/rilascio è sempre relativa ad un singolo blocco { } di codice: metodo o blocco synchronized).

    Condition (interfaccia java.util.concurrent.locks.Condition) è l'equivalente "esplicito" della condition queue intrinseca di un oggetto.
    Un Condition lo si ottiene da un Lock tramite il suo newCondition().
    Nel javadoc di Condition c'è spiegazione/esempio di uso.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    grazie per il chiarimento ,quindi per ogni variabile condizione che c'è, è d'obbligo un metodo per mettere in attesa e un altro per svegliare(await-signal)??
    Un altro dubbio che mi assilla è perchè vi è il while, ad esempio nel metodo sotto, cioè perchè non andrebbe bene un if???


    codice:
     class BoundedBuffer {
       final Lock lock = new ReentrantLock();
       final Condition notFull  = lock.newCondition(); 
       final Condition notEmpty = lock.newCondition(); 
    
       final Object[] items = new Object[100];
       int putptr, takeptr, count;
    
       public void put(Object x) throws InterruptedException {
         lock.lock();
         try {
           while (count == items.length)//<-------qui
             notFull.await();
           items[putptr] = x;
           if (++putptr == items.length) putptr = 0;
           ++count;
           notEmpty.signal();
         } finally {
           lock.unlock();
         }
       }
    
       public Object take() throws InterruptedException {
         lock.lock();
         try {
           while (count == 0)
             notEmpty.await();
           Object x = items[takeptr];
           if (++takeptr == items.length) takeptr = 0;
           --count;
           notFull.signal();
           return x;
         } finally {
           lock.unlock();
         }
       }
     }

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da valeriAsus
    quindi per ogni variabile condizione che c'è, è d'obbligo un metodo per mettere in attesa e un altro per svegliare(await-signal)??
    Una condition queue (qui adesso non conta se intrinseca-implicita o esplicita) è appunto una "coda di attesa su condizione". È chiaro che se un X ci entra e aspetta finché la condizione non diventa valida, ci deve essere un Y che lo "sveglia". Insomma, si usa quando ci sono almeno 2 thread che devono fare delle operazioni (tipicamente scambiarsi dati) in modo coordinato.

    Originariamente inviato da valeriAsus
    Un altro dubbio che mi assilla è perchè vi è il while, ad esempio nel metodo sotto, cioè perchè non andrebbe bene un if???
    No il if non va bene. Sia per una condition queue intrinseca che esplicita, l'idioma tipico d'uso è il test della condizione in un while.

    Se leggi la documentazione di await() dice:

    [...] until one of four things happens:
    [.....]
    * A "spurious wakeup" occurs.

    Cioè è possibile avere un wakeup "spurio", dovuto a questioni interne della JVM. In quel caso la condizione va ritestata. Ecco il motivo del ciclo, un if non sarebbe "robusto" in quel senso.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

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.