Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Java - dubbio sul synchronized in java
Forum - Java - dubbio sul synchronized in java

Avatar
robyp7 (Normal User)
Newbie


Messaggi: 13
Iscritto: 02/07/2008

Segnala al moderatore
Postato alle 16:16
Giovedì, 01/01/2009
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

PM Quote
Avatar
netarrow (Admin)
Guru^2


Messaggi: 2502
Iscritto: 12/05/2004

Segnala al moderatore
Postato alle 21:20
Lunedì, 05/01/2009
Quando un thread accede a un metodo sincronizzato in un'istanza, viene bloccato l'accesso non a tutti i metodi, ma solo agli altri che sono anche loro dichiarati sincronizzati su quella istanza.

Quindi quando si usa synchronized(this) è come dichirare direttamente il metodo come synchronized. Cioè è come se tu scrivessi a così:

public synchronized a()

In questo modo il monitor dell'istanza this è serializzato e quindi quando un thread chiama a, tutti gli altri thread che vorranno chiamare a saranno in attesa.

Nel caso degli altri due metodi essi sono sempre della stessa istanza (this) ma non sono sincronizzati sul monitor di this (visto che non sono dichiarati synchronized e non c'è un blocco tale su this).

Il fatto che il codice di b e c contenga un blocco synchronized su lock1 vuol dire che sarà come se someoperations sia dichiarato synchronized nella classe a cui appartiene lock1.

Quindi io credo che per come hai messo il codice non è sicuro che se un thread chiama a() gli altri non possano chiamare b o c.

Per sicurezza, e per chiarezza, io lo scriverei così:

Codice sorgente - presumibilmente Java

  1. public synchronized  void a(){
  2. some operations()
  3. a=5;  
  4. }
  5.  
  6. public synchronized  void b(){
  7. synchronized (lock1){
  8. lock1.some operations()
  9. a++
  10. ...
  11. }
  12. }
  13.  
  14. public synchronized  void c(){
  15. synchronized (lock1){
  16. lock1.some operations()
  17. a++
  18. ...
  19. }
  20. }


PM Quote