Dubbio su Join all'interno di Syncronized

di il
2 risposte

Dubbio su Join all'interno di Syncronized

Salve a tutti!

Apro questo topic perché ho un grandissimo dubbio che non riesco a sciogliere.

Se, all'interno di un metodo synchronized uso un thread1.join, dove thread1 è un thread creato e referenziato, rischio il deadlock?
Oppure join rilascia il lock del synchronized?

Purtroppo cercando su internet non ho trovato una risposta precisa. C'è chi dice che Join usa, al suo interno, il metodo wait, mentre altri dicono che possa causare deadlock.
Grazie mille a tutti, spero che qualcuno saprà rispondermi.

2 Risposte

  • Re: Dubbio su Join all'interno di Syncronized

    Ciao TKingu,
    il metodo join non causa direttamente deadlock, dipende chiaramente dal resto del codice e della sincronizzazione, però è vero che i blocchi synchronized non garantiscono la fairness perchè qualunque blocco può ottenere il lock e impedire agli altri di essere eseguiti (con conseguente deadlock e starvation).
    il join non fa altro che mettere il processo thread1 in attesa svegliandolo quando il thread principale (quello in cui .join è stato invocato) termini.
    Personalmente anche se più macchinoso faccio uso dei ReentrantLock:
    -Garantiscono fairness,
    -C'è un metodo tryLock() (che prende il lock solo se è libero, cosa molto utile)
    -Hai una gestione completa di tutti i processi in attesa

    Sostanzialmente usare i lock manualmente rende il tuo codice più flessibile e si aprono tante nuove possibilità.
  • Re: Dubbio su Join all'interno di Syncronized

    TKingu ha scritto:


    Se, all'interno di un metodo synchronized uso un thread1.join, dove thread1 è un thread creato e referenziato, rischio il deadlock?
    Certo, è possibile.
    Scenario: il thread A ha acquisito il lock su un oggetto X e all'interno del blocco synchronized fa un join() su un thread B. Il thread B va avanti per la sua strada e ad un certo punto cerca di acquisire il lock su quello stesso oggetto X. Ovviamente va in sospensione perché il lock è tenuto al momento dal thread A.
    Quindi: il thread B non può continuare perché attende di acquisire il lock e il thread A non può continuare perché attende la fine di B (che non può procedere avanti e poi terminare).
    E questo si chiama appunto ... deadlock.

    TKingu ha scritto:


    Oppure join rilascia il lock del synchronized?
    No, join() NON rilascia alcun lock (l'unico metodo che rilascia il lock è il wait() degli oggetti, che è fatto apposta per sfruttare, insieme ai notify(), la "condition-queue" intrinseca degli oggetti).
Devi accedere o registrarti per scrivere nel forum
2 risposte