2011-07-01 20 views
5

Sé que la lectura desde un solo objeto a través de múltiples hilos es segura en Java, siempre que el objeto no se haya escrito. Pero, ¿cuáles son las implicaciones de rendimiento de hacer eso en lugar de copiar los datos por hilo?¿Cuáles son las implicaciones de rendimiento de compartir objetos entre subprocesos?

¿Los hilos tienen que esperar a que otros terminen de leer la memoria? ¿O los datos están copiados implícitamente (el motivo de existencia de volatile)? Pero, ¿qué haría eso por el uso de memoria de toda la JVM? ¿Y cómo difiere todo cuando el objeto que se lee es más antiguo que los hilos que lo leen, en lugar de crearse en su tiempo de vida?

Respuesta

3

Si sabe que un objeto no va a cambiar (por ejemplo, objetos inmutables como cadena o un entero) y tienen, por lo tanto, evitar el uso de cualquiera de las construcciones de sincronización (synchronized, volatile), la lectura de ese objeto desde varios subprocesos hace no tiene ningún impacto en el rendimiento. Todos los hilos accederán a la memoria donde el objeto se almacena en paralelo.

Sin embargo, la JVM puede elegir almacenar en caché algunos valores localmente en cada subproceso por motivos de rendimiento. El uso de volatile solo prohíbe ese comportamiento: la JVM tendrá que acceder explícita y atómicamente a un campo volatile todas las veces.

+0

Esto responde mi pregunta, así que gracias, aquí hay una aceptación. Sin embargo, estoy interesado en cómo funciona el acceso paralelo en el nivel de hardware, pero quizás eso está fuera del alcance de esta pregunta en particular. –

1

Si los datos se están leyendo, no hay implicación porque varios subprocesos pueden acceder a la misma memoria al mismo tiempo. Solo cuando se produce la escritura debido a mecanismos de bloqueo, recibirá un golpe de rendimiento. Nota sobre volátil (no recuerdo si es lo mismo en Java que en C) pero se usa para datos que pueden cambiar desde debajo del programa (como el direccionamiento directo de datos en c) o si desea atomicidad para sus datos. Copiar los datos no haría una diferencia en el rendimiento, pero usaría más memoria.

1

Para tener un estado compartido entre varios subprocesos, tendrá que coordinar el acceso a él utilizando algún mecanismo de sincronización: volátil, sincronización, cas. No estoy seguro de lo que espera oír sobre "implicación del rendimiento", dependerá de la situación concreta y el contexto. En general, pagará un precio por tener que coordinar el acceso al objeto compartido por varios hilos.

Cuestiones relacionadas