¿Qué estás tratando de hacer? Las palabras clave synchronized
y volatile
son mecanismos en Java que se pueden usar para garantizar que los diferentes hilos que observan los mismos valores observen valores consistentes. En particular, le permiten razonar acerca de sucede antes de las relaciones en sus programas.
Simplemente no puede evitar el uso de uno de volatile
o synchronized
para acceder correctamente a los campos no final
en un programa multiproceso. Dicho esto, la razón principal por la que es probable que requiera synchronized
sobre volatile
es el requisito para usar operaciones de comparación atómica y establecer (es decir, no será ninguna consideración de rendimiento). Por ejemplo, en un multi-hilo programa:
volatile int i = 0;
public void foo() {
if (i == 0) i = i + 1;
}
El código anterior es inherentemente insegura, a pesar de la declaración de la variable como medios volátiles que lee y escribe se vuelcan a la memoria principal - la única aplicación segura de tal El método sería algo así como:
int i = 0;
public synchronized void foo() {
if (i == 0) i = i + 1;
}
¿Cuál debería preferir? Bueno, si tiene varios hilos que modifican un campo que depende del valor de ese campo (es decir, comparar y establecer), entonces synchronized
es la única solución segura.
También vale la pena decir: la sobrecarga de rendimiento de synchronized
no es un problema (en la gran mayoría de los casos). Los problemas de sincronización de rendimiento generalmente se deben a cuellos de botella innecesarios, bloqueos o bloqueos y se pueden mitigar si es necesario. Cualquier puros reloj ciclos sobrecarga será eclipsada por otras cosas que la aplicación hace: archivo IO, consultas de bases de datos, etc. interacción remota
¿Por qué "no desea bloquear [su] clase"? (Tenga en cuenta que el bloqueo de un método de instancia solo se lleva a cabo en el objeto mismo). Tenga en cuenta también que las JVM modernas son extremadamente avanzadas y la sobrecarga de rendimiento de la sincronización generalmente no es un problema –
Tengo un jsp donde muchas personas acceden/actualizan los datos. los datos están en un objeto de caché y allí necesito estas sincronizaciones y et al. porque la cantidad de personas podría ser numerosa. – DKSRathore
Creo que debería ir con AomicDouble. – DKSRathore