Visualizzazione dei risultati da 1 a 2 su 2
  1. #1

    [JAVA] Lock implicito ed esplicito

    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

    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();}
    }
    Da quel poco che immaginavo, credevo che il lock implicito corrispondesse con quello esplicito:

    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?

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

    Re: [JAVA] Lock implicito ed esplicito

    Originariamente inviato da ragnonerodocet
    Da quel poco che immaginavo, credevo che il lock implicito corrispondesse con quello esplicito
    No, la "meccanica" interna del lock è diversa. synchronized acquisisce il lock intrinseco su un oggetto. Un ReentrantLock è un oggetto che al suo interno contiene tutta la logica di lock (e che, se non sbaglio, non usa nemmeno un lock intrinseco ma usa un algoritmo credo non banale basato su strutture dati particolari e anche su variabili volatile).

    Quindi fare, come limite estremo, ad esempio: synchronized(lucchetto) non vuol nemmeno dire che puoi acquisire il lock esplicito!! Vuol dire che solo che puoi acquisire il lock intrinseco sull'oggetto referenziato da lucchetto.

    Originariamente inviato da ragnonerodocet
    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.
    Esatto.
    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.