2010-05-20 3 views

Répondre

30

Alors que les classes Gava Immutable sont threadsafe, leurs constructeurs ne le sont pas. Pour la plupart des applications, un seul thread interagira avec une instance Builder particulière.

Bien que l'absence de sécurité de thread n'a généralement pas besoin d'être documentée, un tel Javadoc peut être utile aux générateurs de collection Immutable. Les gens peuvent être surpris que ImmutableList soit threadsafe alors que ImmutableList.Builder ne l'est pas.

+0

Avez-vous une preuve? L'article "Immutable Collections" (https://github.com/google/guava/wiki/ImmutableCollectionsExplained) dit "Les objets immuables peuvent être utilisés par de nombreux threads" mais il ne dit pas explicitement "La collection Immuable de Guava est thread-safe" . Je ne suis toujours pas convaincu :-( – 30thh

13

Si la sécurité des threads n'est pas mentionnée dans les javadocs, ne l'assumez pas!

Plus sérieusement, "non".

Je préférerais aussi javadocs de ImmutableList et les amis incluent une telle remarque plus évidente, oui- (donc vous ne devriez pas l'assumer vous-même), parce que le "évident" n'est pas toujours le cas. Juste l'autre jour, je discutais de scala.List, une liste immuable, et quelques problèmes surprenants qu'elle pourrait causer si échangés entre threads de façon inappropriée (via une course de données), que les gens ne pensaient pas parce qu'ils voient le mot "immuable" sur la boîte , plus ils assimilent "immutable == thread-safe", de sorte qu'il est payant d'être prudent, même en documentant des aspects "évidents" de la sécurité des threads.

2

D'accord avec @Dimitris Andreou: ne présumez certainement pas la sécurité du fil si elle n'est pas documentée en tant que telle. Lorsque vous allez à l'effort de faire un threadsafe classe non-trivial, vous voulez les utilisateurs de le connaître. Au-delà de cela, je pense que le cas d'utilisation le plus courant pour un constructeur sera confiné au thread: c'est-à-dire en tant que variable locale dans une méthode. Si vous avez besoin de plusieurs threads pour créer une liste, est-il encore immuable?

Si vous avez plusieurs threads alimentant une liste, mais que vous voulez l'instantané et dire "plus de changements à venir, c'est immuable" alors j'écrirais quelque chose qui prendrait les éléments de ces threads et gèlerait le contenu dans une nouvelle ImmutableList quand vous savez qu'il est prêt.

Questions connexes