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

    dubbio sul sincronismo dei thread in java

    ciao

    ho un dubbio.. se in un codice ho una parte che è nel synchronize(this) quando i entra un thread anche tutti gli altri synchronized sono bloccati?


    ad esempio:

    se io ho

    public void a(){
    synchronized (this){
    some operations()
    a=5;
    ....
    }
    }

    public void b(){
    synchronized (lock1){
    lock1.some operations()
    a++
    ...
    }
    }

    public void c(){
    synchronized (lock1){
    lock1.some operations()
    a++
    ...
    }
    }



    ecco di solito io sapevo che il synchronized su lock1 impedisce a + thread di entrare in c, la stessa cosa per b. Inoltre impedisce anche ad un'altro thread di entrare in b se un'altro thread è già entrato in c o viceversa (perchè b e c sono sincronizzati sullo stesso oggetto cioè lock1). Ma nel caso di this cioè se un thread è in this l'oggetto per intero (quella istanza ) è bloccata ma quindi non entra nessun thread neanche in b e c giusto? quindi se io assegno a =5 invicando a, non può succedere che un'altro thread nel frattempo che entra in b o c sovrascriva a e quindi il valore di a potrebbe essere non quello del flusso di esecuzione atteso se tutto fosse sincronizzato nel modo corretto?


    grazie
    Roby

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

    Re: dubbio sul sincronismo dei thread in java

    Originariamente inviato da robyp7582
    se in un codice ho una parte che è nel synchronize(this) quando i entra un thread anche tutti gli altri synchronized sono bloccati?
    Quello che conta è l'oggetto su cui si cerca di acquisire il lock. Nel tuo codice sopra, se acquisisci il lock su this (l'oggetto su cui hai invocato il metodo), ovviamente non hai acquisito il lock su lock1, che è un altro oggetto.
    Quindi un thread A può eseguire a() e contemporaneamente un thread B può eseguire b() o c(). Due thread A e B non possono eseguire nello stesso momento uno b() e l'altro c(), perché in entrambi i metodi si cerca di acquisire il lock sullo stesso oggetto (lock1).

    Ripeto: bisogna vedere su quale oggetto si cerca di acquisire il lock. Se un thread acquisisce il lock sull'oggetto X, nessun altro thread può acquisire il lock su quell'oggetto X.

    P.S. E basandosi su quanto ho appena detto, il tuo codice è sbagliato: i tre metodi hanno a che fare con la stessa variabile 'a' ma i lock sono su oggetti diversi. Che succede se si sta eseguendo a++ (che non è atomica!!) in b() e un altro thread contemporaneamente esegue a=5 in a()???
    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 © 2026 vBulletin Solutions, Inc. All rights reserved.