Questo è il mio Java 1.6 classe:Cosa significa "sincronizzazione incoerente"?
public class Foo {
private ArrayList<String> names;
public void scan() {
if (names == null) {
synchronized (this) {
this.names = new ArrayList<String>();
// fill the array with data
}
}
}
}
Findbugs dice:
Inconsistent synchronization of com.XXX.Foo.names; locked 40% of time
Che cosa significa e che cosa sto facendo male? Sto cercando di evitare problemi quando due o più client chiamano allo stesso tempo Foo.scan()
.
Se si prevede di utilizzare questo idioma, la variabile dei nomi deve essere contrassegnata come volatile. –
Dovresti anche controllare se 'names' è nullo prima di inserire il blocco sranoize. Questo evita il blocco quando non è necessario. – Jeremy
@Phil M perché i nomi dovrebbero essere contrassegnati come volatili? Ho pensato che synchonized fornisse la stessa visibilità di volatile. Quindi non aggiungerei nulla finché l'accesso ai nomi utilizza lo stesso blocco. – brain