Un blocco di rientro è uno che la stessa thread può acquisire più di una volta. Comunemente, un blocco rientro deve essere sbloccato lo stesso numero di volte in cui è bloccato. Un blocco di rientro è spesso molto più facile da codificare. Se hai diversi metodi in cui A chiama B e B chiama C ... ma il client di questo codice può chiamare in A o B o C, e se vuoi bloccare all'interno di ciascuno di questi metodi, allora un blocco di rientro risolverà il tuo problema. Impedirà l'accesso a questo codice a thread diversi da uno alla volta, ma consentirà l'acquisizione di più lock in modo da non bloccarsi.
Diciamo che hai questo:
public class SyncTest {
private final Lock lock = new ReentrantLock();
public void doA() {
lock.lock();
try {
doB();
doSomethingForA();
} finally {
lock.unlock();
}
}
public void doB() {
lock.lock();
try {
doC();
doSomethingForB();
} finally {
lock.unlock();
}
}
public void doC() {
lock.lock();
try {
doSomeWorkThatEveryoneDoes();
} finally {
lock.unlock();
}
}
}
dove altro codice può chiamare uno dei doA
o doB
o doC
e tutti loro sincronizzare intorno po 'di lavoro con lo stesso blocco. Il blocco utilizzato è "rientrante" in quanto lo stesso thread può acquisirlo più volte. Se la serratura non è rientrante, quando chiami doA
, nel momento in cui inserisci doB
e provi ad acquisire il blocco, sarai bloccato perché il blocco è già in possesso, anche se è di tua proprietà.
Un semaforo di conteggio puro inizializzato a un conteggio di uno, ad esempio, è un blocco non rientranti. Se lo stesso thread tenta di acquisirlo due volte, bloccherà per sempre in una sorta di auto-deadlock.
Non proprio un duplicato. Questa domanda è molto più specifica e riguarda alcune specifiche implementazioni del blocco Java. L'altra domanda è molto generale. – Eddie