No ... allora .. facciamo un po' di chiarezza.Originariamente inviato da Azzurra85
Ho un dubbio....e spero che qualcuno sappia chiarire.
Se io ho un metodo sincronizzato in java e al suo interno chiamo un metodo non sincronizzato, quando entro nel metodo non sincronizzato io perdo il lock a meno che il metodo non sincronizzato lo sincronizzi sullo stesso oggetto del metodo sincronizzato principale. Dico bene oppure sbaglio?????????????
La parola chiave synchronized serve per acquisire il lock su un oggetto. Quale oggetto dipende ovviamente da come viene usato, intendo dire se su un metodo di istanza o di classe oppure su un blocco (nel qual caso va specificato l'oggetto).
Ma a parte questo, una volta acquisito il lock lo si mantiene fino all'uscita del metodo/blocco synchronized!!
Se dentro un metodo synchronized si invoca un metodo non synchronized, il lock viene mantenuto e questo vale pure se si invoca un altro metodo anch'esso synchronized. Se quest'ultimo metodo è synchronized su un diverso oggetto, allora si acquisirà anche quest'altro lock.
Se fosse sullo stesso oggetto, non ci sono problemi. La gestione dei lock è "rientrante". Se si cerca di acquisire un lock che già si possiede non c'è alcun inconveniente.
L'unico metodo che causa il rilascio del lock è la invocazione di wait() sull'oggetto su cui si possiede (e questo è tassativo) il lock.