todavia sincronizar sincroniza samsung ningun microsoft este dispositivo con como calendario automaticamente agenda java concurrency synchronization parallel-processing monitor

sincronizar - ¿La sincronización de Java actualizará la caché completa, o solo el objeto en el que sincronicé?



sincronizar outlook 2010 con android (2)

Si accedo a un objeto dentro de un método sincronizado o bloque sincronizado, ¿todos los objetos en ese elemento accedido también están sincronizados?

Imagine que hay un objeto Queue tiene un método synchronized add() y take() , que acepta y distribuye el objeto complejo Thing . Thing tiene muchas listas con otros objetos diferentes.

Ahora el hilo de imagen Before crea Thing y pone algunos objetos existentes en Thing , modifica algunos de estos objetos y así sucesivamente. El subproceso Before agrega Thing to Queue . Un poco más tarde, thread After toma el Thing from Queue .

PREGUNTA: ¿ Thing y todos sus hijos / subobjetos estarán en el mismo estado en el que Before dejó? Incluso si el hilo After fue tal vez trabajando en uno de estos subelementos un poco antes? Porque imagino el procesador para el hilo. Puede que aún tenga algo de información en caché en ese subelemento (la dirección de ese subobjeto sigue siendo la misma). ¿Todo esto en caché se invalidaría solo al acceder al objeto padre Thing de forma sincronizada?

No proporcione respuestas como usar las librerías de concurrencia, etc. Quiero entender qué está pasando.


El concepto importante en el modelo de memoria de Java es el orden de pasar antes de . Resultados de las acciones de escritura que suceden, antes de que las acciones de lectura sean visibles para estas acciones de lectura. Otros resultados pueden ser visibles o no.

El orden de suceder antes es inducido por el orden de sincronización de las acciones entre los hilos, y por el orden natural de las acciones en los hilos individuales.

Si está en Before sincronizar en un objeto (por ejemplo, su Queue ), y realiza todas sus manipulaciones de Thing y sus "subobjetos" dentro o antes de este bloque sincronizado, y After sincronizado en la misma Queue y lee estos objetos en o después del bloque sincronizado, entonces todos esos cambios son visibles para After .


Si un hilo modifica una variable, no se garantiza que otro hilo vea los cambios, excepto en los siguientes casos (bueno, al menos en los siguientes casos: no estoy 100% seguro de que haya más):

  • el hilo modificante deja un bloque o método sincronizado; esto induce un enjuague de la memoria caché de hilos (de la misma manera, un hilo que ingresa en un bloque o método sincronizado induce una actualización): esto es lo que sucede en su caso
  • la variable modificada se declara volatile o es una de las variables atómicas de java.util.concurrent.atomic
  • el hilo de modificación finaliza (esto también induce una descarga, así como el inicio de un hilo induce una actualización)

Entonces, si sincronizas como lo explicaste, otros hilos verán todos los cambios.