2011-12-05 21 views
11

Estoy tratando de encontrar documentación que indique si java.util.concurrent.Future es/no es seguro para los hilos. Por ejemplo, ¿puedo asignar con seguridad la misma instancia de futuro a múltiples hilos, que todos llamarán Future.get (...)?¿Es java.util.concurrent.Future threadsafe?

He probado el código utilizando Future de esta manera y parece funcionar bien, pero estaría mucho más feliz si pudiera encontrar una expectativa documentada de que el futuro es seguro para el acceso simultáneo de esta manera.

Gracias.

+2

Esencialmente, este comentario es el mismo que la respuesta de Nizet: puede ver las garantías de coherencia de memoria en JDK javadoc: http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/package- summary.html # package_description –

+0

¿Es seguro leer "Acciones tomadas por el cálculo asincrónico representado por un futuro sucederá antes de las acciones posteriores a la recuperación del resultado a través de Future.get() en otro hilo". como cierto para _many_ otros hilos, así como un solo otro hilo? - "otro hilo" leído literalmente indica un ** único ** otro hilo en oposición a muchos. Parece probable que un implementador del futuro tenga que esforzarse para que sea beneficioso para muchos y funcione para uno, así que sospecho fuertemente que esto es seguro en la realidad. – S42

+1

Sí, porque cada llamada a 'Future.get()' estará bajo la garantía "sucede antes". Es porque cada llamada compilada en el mismo ensamblado que implica una u otra forma de http://en.wikipedia.org/wiki/Memory_barrier –

Respuesta

9

Dado que Future está destinado a ser utilizado por varios hilos (al menos el que envía, y el que establece su resultado), y dado que la documentación especifica que hay una relación de suceder antes entre el cálculo asincrónico y las acciones que ocurren después de la llamada get, supongo que las implementaciones son seguras para hilos (al menos las implementaciones estándar).

+1

Estoy muy inclinado a aceptar que es casi seguro seguro en realidad, dado que la seguridad de subprocesos para suceder antes de trabajar entre 2 subprocesos también sería bueno para N subprocesos, sin embargo, no estoy 100% claro si puedo interpretar the happen-before como garantizado para muchos hilos cuando la redacción de la garantía sugiere un solo otro hilo. A pesar de esa pequeña reserva, estoy votando su comentario ya que parece ser la mejor respuesta disponible. – S42

+1

@ S42 Estás leyendo la fraseología literalmente. En Java, no hay absolutamente ninguna comunicación especial entre un par de hilos; todos los hilos se comunican sincronizando la memoria, y está igualmente disponible para todos los hilos. – toto2

4

Si está utilizando un Future devuelto desde un ExecutorService, entonces sí se garantiza que son seguros para subprocesos. Como Future es una interfaz, el creador de la interfaz no puede garantizar que todas las implementaciones sean seguras para hilos.

Sin embargo, Nizet plantea un buen punto. Los doctores dicen que las implementaciones de la interfaz Future deberían ser seguras para hilos, no hacer que la implementación thread-safe violaría el contrato del futuro

Cuestiones relacionadas