mi sono imbattuto in alcuni (produzione!) Il codice che appare come il frammento di seguito:Assegnazione di un oggetto all'interno di un blocco sincronizzato in base a tale oggetto (Java)
synchronized(some_object) {
some_object = new some_object()
}
mi aspetterei questo per essere oggetto di ogni sorta di orribili condizioni di gara, e che un secondo thread potrebbe entrare in questo blocco quando viene creato il nuovo oggetto. Le mie costolette di Java non sono abbastanza buone per affermare in modo definitivo il comportamento atteso di sopra, così curioso di cosa tu abbia da dire prima di rifarlo.
Non è scritto esattamente così. Nel mio caso la classe ha la variabile some_object che viene utilizzata per il blocco di sincronizzazione e questa variabile viene riassegnata all'interno dello stesso blocco. –
+1 la chiave qui è che la sincronizzazione si riferisce all'oggetto, non al riferimento. Dopo che il 'new' è stato eseguito e assegnato, sei ancora bloccato sul vecchio oggetto. Il nuovo oggetto non è bloccato a questo punto. Quando il blocco sincronizzato viene chiuso, viene rilasciato il blocco sul vecchio oggetto e, se non vi sono altri riferimenti, è idoneo per gc. Se c'è più codice nel vero blocco sincronizzato e dipende dal blocco in qualche modo trasferito al nuovo oggetto, allora potresti avere un problema. –
Grazie Jim. Il fatto che il lucchetto sia sull'oggetto e non sul riferimento ha senso per me. Quello su cui ero indifferente era quando l'oggetto referenziato da quella variabile era cambiato, un altro thread avrebbe visto un altro oggetto sbloccato e sarebbe entrato di nuovo nel blocco, o fare in modo che i meccanismi di un blocco sincronizzato impedissero che ciò accadesse? –