private volatile Object obj = new MyObject();
void foo()
{
synchronized(obj)
{
obj.doWork();
}
}
void bar()
{
synchronized(obj)
{
obj.doWork();
obj = new MyObject(); // <<<< notice this line (call it line-x)
}
}
supponga ad un certo punto nel tempo, un filo t_bar
sta eseguendo bar()
, e un'altra t_foo
sta eseguendo foo
e che t_bar
ha appena acquisito obj
, così t_foo
è, in effetti, in attesa.sincronizzare sull'oggetto non finale
Dopo l'esecuzione del blocco di sincronizzazione in bar
, foo
eseguirà il blocco di sincronizzazione, giusto? Quale valore di obj
vedrebbe? Quello vecchio? O il nuovo set in bar
?
(vorrei speranza che il nuovo valore è visto, questo è il punto di codifica in questo modo, ma voglio sapere se questa è una scommessa 'sicuro')
@javapirate: trovo MOLTO scortese che hai modificato il mio post semplicemente perché preferisci il tuo stile di formattazione K & R? Mi dispiace, ma dovrò riformattare di nuovo. –
Siamo spiacenti. Ho pensato di liberarmi di molti spazi vuoti. Vai avanti! –
Una distinzione che potrebbe aiutare a capire è che * oggetti * o non finale o non finale, sono le variabili che contengono riferimenti a loro. Il lucchetto si trova sull'oggetto, non sulla variabile. –