2010-05-20 15 views

Respuesta

30

Mientras que las clases de Guava Inmutable son enhebrables, sus constructores no lo son. Para la mayoría de las aplicaciones, solo un hilo interactuará con cualquier instancia particular del generador.

Si bien la ausencia de seguridad de subprocesos generalmente no necesita documentarse, tal Javadoc podría tener sentido para los compiladores de compilación inmutables. La gente puede sorprenderse de que ImmutableList sea seguro mientras ImmutableList.Builder no lo es.

+0

¿Tiene alguna prueba? El artículo "Colecciones inmutables" (https://github.com/google/guava/wiki/ImmutableCollectionsExplained) dice "Los objetos inmutables pueden ser utilizados por muchos hilos" pero no dice explícitamente "Guava Immutable Collection is thread-safe" . Sigo sin estar convencido :-( – 30thh

13

Si la seguridad de la rosca no se menciona en los javadocs, ¡no lo asuma!

Más en serio, "no".

Yo también preferiría los javadocs de ImmutableList y los amigos incluyen una observación tan obvia, sí (por lo que no tendrías que asumirla tú mismo), porque lo "obvio" no siempre es el caso. El otro día estaba discutiendo scala.List, una lista inmutable y algunos problemas sorprendentes que puede causar si se intercambian entre subprocesos de manera inapropiada (a través de una carrera de datos), en la que las personas no pensaban porque ven la palabra "inmutable" en la lata Además, equiparan "inmutable == thread-safe", por lo que vale la pena estar a salvo, incluso cuando se documentan aspectos "obvios" de seguridad de hilos.

2

De acuerdo con @Dimitris Andreou: definitivamente no asume la seguridad del hilo si no está documentado como tal. Cuando se hace el esfuerzo de hacer una clase no trivial segura para el hilo, usted quiere que los usuarios lo conozcan.

Más allá de eso, creo que el caso de uso más común para un generador estará limitado por hilos: es decir, como una variable local en algún método. Si necesita varios hilos para construir una lista, ¿es realmente inmutable?

Si tiene varios hilos que se alimentan en una lista, pero desea realizar una instantánea en algún momento y decir "no más cambios en el futuro, es inmutable", escribiría algo que tome los elementos de esos hilos y congele el contenido en una nueva ImmutableList cuando sabe que está listo.

Cuestiones relacionadas