Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2009
    Messaggi
    17

    thread e metodi sincronizzati

    Volevo sapere se le mie risposte dopo aver studiato i thread siano giuste...Grazie mille a chiunque mi risponda

    codice:
    class A { 
        public synchronized void m1() {
              istr1;
        }
        public void m2() {
                  istr2;
                  synchronized(this){ istr3;}
         }
    }
    Siano dati due oggetti, a e b, della classe A, due thread, th1 e th2, che eseguono i metodi di a, e un thread th3 che esegue i metodi di b.
    Spiegare se è possibile che:

    (a) th1 e th2 eseguano contemporaneamente l’istruzione istr1?
    No perchè l'istruzione una che si trova nel metodo m1() è sincronizzato quindi viene svolto da un thread alla volta.

    (b) th1 e th2 eseguano contemporaneamente l’istruzione istr2?
    Sì perchè istr2 si trova nel metodo m2() e non è sincronizzato

    (c) th1 e th3 eseguano contemporaneamente l’istruzione istr3?
    Sì perchè sono due oggetti distinti uno della classe A l'altro della classe B quindi i due thread non interferiscono tra di loro

    (d) th1 e th2 eseguano contemporaneamente uno l’istruzione istr1 e l’altro l’istruzione istr2?
    Sì perchè l'istruzione istr2 non è sincronizzata

    (e) th1 e th2 eseguano contemporaneamente uno l’istruzione istr1 e l’altro l’istruzione istr3?
    No perchè th1 sta eseguendo un metodo sincronizzato essendo che fanno riferimento allo stesso oggetto deve attendere la terminazione del th1 per iniziare th2

    (f ) th1 e th3 eseguano contemporaneamente uno l’istruzione istr1 e l’altro l’istruzione istr3?
    Sì perchè si riferiscono a due oggetti distinti quindi non interferiscono con i thread che eseguono metodi sincronizzati dell'altro

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

    Re: thread e metodi sincronizzati

    Originariamente inviato da leon09
    (a) th1 e th2 eseguano contemporaneamente l’istruzione istr1?
    No perchè l'istruzione una che si trova nel metodo m1() è sincronizzato quindi viene svolto da un thread alla volta.
    Corretto. m1() effettua il lock implicitamente sul this (l'oggetto stesso su cui è invocato) e th1/th2 usano lo stesso oggetto = stesso lock = mutua esclusione.

    Originariamente inviato da leon09
    (b) th1 e th2 eseguano contemporaneamente l’istruzione istr2?
    Sì perchè istr2 si trova nel metodo m2() e non è sincronizzato
    Corretto.

    Originariamente inviato da leon09
    (c) th1 e th3 eseguano contemporaneamente l’istruzione istr3?
    Sì perchè sono due oggetti distinti uno della classe A l'altro della classe B quindi i due thread non interferiscono tra di loro
    Corretto, lock su oggetti differenti = nessuna mutua esclusione.

    Originariamente inviato da leon09
    (d) th1 e th2 eseguano contemporaneamente uno l’istruzione istr1 e l’altro l’istruzione istr2?
    Sì perchè l'istruzione istr2 non è sincronizzata
    Corretto.

    Originariamente inviato da leon09
    (e) th1 e th2 eseguano contemporaneamente uno l’istruzione istr1 e l’altro l’istruzione istr3?
    No perchè th1 sta eseguendo un metodo sincronizzato essendo che fanno riferimento allo stesso oggetto deve attendere la terminazione del th1 per iniziare th2
    Corretto, anche se a livello di codice sono scritti diversamente (synchronized sulla dichiarazione di m1 e una istruzione synchronized che racchiude un blocco) il lock è ancora sullo stesso oggetto, come per (a)

    Originariamente inviato da leon09
    (f ) th1 e th3 eseguano contemporaneamente uno l’istruzione istr1 e l’altro l’istruzione istr3?
    Sì perchè si riferiscono a due oggetti distinti quindi non interferiscono con i thread che eseguono metodi sincronizzati dell'altro
    Corretto, come per (c)
    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
    Jul 2009
    Messaggi
    17
    Grazie mille forse ci sto capendo qualcosa di questi thread sincronizzati grazie grazie e grazie

  4. #4
    Utente di HTML.it
    Registrato dal
    Jul 2009
    Messaggi
    17
    Avrei altri dubbi sempre sullo stesso argomento:

    codice:
    class Magazzino { 
       private int conta = 0;
       public Prodotto trova() { 
           synchronized(this) {
                       conta++;
            }
    ... trova un prodotto p... (*)
    
        synchronized(this)  { 
                   conta;
                   if(conta == 0) 
                             notifyAll();
         }
          return p;
    }
    
      public synchronized void aggiungi(Prodotto p) { 
                   while(conta > 0)
                                 try {
                                       wait();
                                   } 
                                    catch(...){}
    ... aggiungi un prodotto p ... (**)
    
                     notifyAll();
      }
    }
    Supponendo che ci siano più thread che eseguono i metodi trova e aggiungi di un unico oggetto
    Magazzino, rispondere alle seguenti domande:
    1. Quale lock usano i blocchi sincronizzati: synchronized(this){...}?
    Un thread alla volta siccome fanno parte di un unico oggetto (stesso oggetto = setto lock = mutua esclusione)

    2. Quale lock usa il metodo aggiungi?
    Un thread alla volta siccome proprio tutto il metodo aggiungi(Prodotto p) è sincronizzato

    3. E' possibile che più thread eseguano l'istruzione (*) contemporaneamente?
    Sì perchè dopo il conta++ il blocco non è più sincronizzato

    4. E' possibile che più thread eseguano l'istruzione (**) contemporaneamente?
    No perchè tutto il metodo aggiungi(Prodotto p) è sincronizzato

    5. E' possibile che un thread esegua l'istruzione (*) e contemporaneamente un altro thread esegua l'istruzione (**)?
    Sì perchè l'istruzione (*) non è sincronizzata

    6. Si modifichi il metodo aggiungi cancellando l'istruzione while. Cambia qualcosa nel
    comportamento della classe Magazzino, in particolare riguardo alle domande 4 e 5?
    Togliendo il while chiunque deve attendendere anche se può svolgere la proprio operazione. No le risposte alle domande 4 e 5 rimangono invariate.

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da leon09
    1. Quale lock usano i blocchi sincronizzati: synchronized(this){...}?
    Un thread alla volta siccome fanno parte di un unico oggetto (stesso oggetto = setto lock = mutua esclusione)
    Corretto, comunque la domanda chiede quale lock ed è ovvio, perché esplicito, il this ovvero l'oggetto su cui è invocato il metodo.

    Originariamente inviato da leon09
    2. Quale lock usa il metodo aggiungi?
    Un thread alla volta siccome proprio tutto il metodo aggiungi(Prodotto p) è sincronizzato
    Corretto ma anche qui chiede quale lock, idem è il this implicitamente.

    Originariamente inviato da leon09
    3. E' possibile che più thread eseguano l'istruzione (*) contemporaneamente?
    Sì perchè dopo il conta++ il blocco non è più sincronizzato
    Corretto.

    Originariamente inviato da leon09
    4. E' possibile che più thread eseguano l'istruzione (**) contemporaneamente?
    No perchè tutto il metodo aggiungi(Prodotto p) è sincronizzato
    Corretto.

    Originariamente inviato da leon09
    5. E' possibile che un thread esegua l'istruzione (*) e contemporaneamente un altro thread esegua l'istruzione (**)?
    Sì perchè l'istruzione (*) non è sincronizzata
    Corretto.

    Originariamente inviato da leon09
    6. Si modifichi il metodo aggiungi cancellando l'istruzione while. Cambia qualcosa nel
    comportamento della classe Magazzino, in particolare riguardo alle domande 4 e 5?
    Togliendo il while chiunque deve attendendere anche se può svolgere la proprio operazione. No le risposte alle domande 4 e 5 rimangono invariate.
    Riguardo a 4. e 5. no, direi che non cambia proprio nulla.
    Se però si toglie il while non è più corretto il comportamento del wait. Il wait() andrebbe sempre racchiuso in un ciclo che testa una condizione.
    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.