Molto meglio che inserire synchronized
ovunque è necessario ragionare attentamente su invarianti di cui le classi hanno bisogno, quindi sincronizzare quanto basta per garantire tali invarianti. Se avete più di-sincronizzazione, si creano due rischi:
- deadlock
- problemi liveness
Deadlock tutti conoscono. I problemi di Liveness non sono legati al costo della sincronizzazione, ma al fatto che se sincronizzi globalmente tutto in un'applicazione multithread, molti thread saranno bloccati in attesa di ottenere un monitor perché un altro thread sta toccando qualcosa di non correlato ma usando lo stesso tenere sotto controllo.
Se si desidera eseguire lo schiaffo di una parola chiave ovunque per motivi di sicurezza, si consiglia di utilizzare final
anziché synchronized
. :)
Tutto ciò che è possibile fare final
contribuisce a migliorare la sicurezza dei thread e un ragionamento più semplice su quali invarianti devono essere gestiti dai blocchi. Per fare un esempio, diciamo che avete questa classe banale:
public class SimpleClass {
private volatile int min, max;
private volatile Date startTime;
// Assume there are many other class members
public SimpleClass(final int min, final int max) {
this.min = min;
this.max = max;
}
public void setMin(final int min) {
// set min and verify that min <= max
}
public void setMax(final int max) {
// set max and verify that min <= max
}
public Date getStartTime() {
return startTime;
}
}
Con la classe di cui sopra, quando si imposta minima o massima, è necessario sincronizzare. Il codice sopra è rotto. Quale invariante ha questa classe? È necessario garantire che min <= max
in qualsiasi momento, anche quando più thread chiamano setMin
o setMax
.
Supponendo che questo è un grande classe con molte variabili e si sincronizza tutto, poi se un thread chiama setMin
e un altro thread chiama getStartTime
, il secondo thread sarà inutilmente bloccato fino setMin
rendimenti. Se lo fai con una classe con molti membri e supponendo che solo pochi di questi membri siano coinvolti in invarianti che devono essere difesi, la sincronizzazione di tutto causerà molti problemi di liveness di questo tipo.
Lo stesso motivo per cui non realizzano gli aeroplani dal materiale della scatola nera ... –