Mucho mejor que poner synchronized
en todas partes es razonar cuidadosamente sobre las invariantes que sus clases necesitan, luego sincronizar lo suficiente para garantizar esas invariantes. Si el exceso de sincronizar, se crea dos riesgos:
- punto muerto
- problemas LIVENESS
punto muerto todo el mundo sabe. Los problemas de Liveness no están relacionados con el costo de la sincronización, sino con el hecho de que si sincronizas globalmente todo en una aplicación multiproceso, entonces muchos hilos serán bloqueados esperando obtener un monitor porque otro hilo está tocando algo no relacionado pero usando el mismo monitor.
Si quiere darle una bofetada a una palabra clave en todas partes por seguridad, entonces le recomiendo usar final
en lugar de synchronized
. :)
Cualquier cosa que pueda hacer final
contribuye a mejorar la seguridad de los hilos y a razonar más acerca de qué invariantes necesitan ser mantenidos por los bloqueos. Para dar un ejemplo, digamos que usted tiene esta clase trivial:
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 clase anterior, al establecer valores mínimos y máximos, es necesario sincronizar. El código anterior está roto. ¿Qué invariante tiene esta clase? Debe asegurarse de que min <= max
en todo momento, incluso cuando hay varios hilos llamando al setMin
o setMax
.
Asumiendo que esto es una gran clase con muchas variables y sincroniza todo, entonces si uno subproceso llama setMin
y otro subproceso llama getStartTime
, el segundo hilo se bloquea hasta que innecesariamente setMin
devoluciones. Si haces esto con una clase con muchos miembros, y suponiendo que solo unos pocos de esos miembros están involucrados en invariantes que deben ser defendidos, sincronizar todo causará muchos problemas de vida de este tipo.
La misma razón por la que no hacen planos con material de caja negra ... –