Il lock implicito che ha ogni oggetto creato in java si manipola mediante synchronized.
Il lock esplicito mediante ReentrantLock (e sue varianti).
Mettiamo che abbia in una classe sia un metodo sincronizzato con la parola synchronized che un metodo sincronizzato mediante ReentrantLock...
esempio pratico
Da quel poco che immaginavo, credevo che il lock implicito corrispondesse con quello esplicito:public void incr1 () {
synchronized (this){
System.out.println("ACQUISITO LOCK INTRINSECO MEDIANTE KEYWORD SYNCHRONIZED");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {System.out.println("FINITO BLOCCO SYNCHRONIZED");}}
}
public void incr2 () {
try {
lucchetto.lock();
System.out
.println("ACQUISITO LOCK ESPLICITO MEDIANTE REENTRANTLOCK");
} catch (Exception e) {
// TODO: handle exception
}try {
Thread.sleep(5000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
finally {System.out.println("FINITO BLOCCO LOCK");
lucchetto.unlock();}
}
Mettiamo che do start a 2 thread che accedano allo stesso oggetto ClasseProva, uno che chiama nel suo metodo run il metodo incr1 e il secondo che chiama incr2.
Pensavo succedesse questo:
1- il thread1 che chiama incr1 prende la cpu e subito dopo il lock implicito dell'oggetto
2- stampa a video
3- va in sleep
4- a questo punto parte il thread2, il quale cerca di acquisire il lock... e a quanto pare ci riesce!!!
Ma allora il lock implicito e quello esplicito sono 2 lock completamente differenti che non interferiscono l'uno con l'altro!!!
Dunque 2 thread che accedano allo stesso oggetto ma usando lock implicito e esplicito è come se accedessero a 2 lock completamente diversi.
SBAGLIO?

Rispondi quotando