2010-05-20 2 views

ответ

30

В то время как классы Guava Immutable являются потокобезопасными, их строителями нет. Для большинства приложений только один поток будет взаимодействовать с любым конкретным экземпляром Builder.

Хотя отсутствие безопасности потока обычно не требуется документировать, такой Javadoc может иметь смысл для сборщиков сборных материалов. Люди могут быть удивлены тем, что ImmutableList является потокобезопасным, а ImmutableList.Builder - нет.

+0

У вас есть доказательство? В статье «Неизменяемые коллекции» (https://github.com/google/guava/wiki/ImmutableCollectionsExplained) говорится: «Неизменяемые объекты могут использоваться многими потоками», но в нем явно не указано, что «Guava Immutable Collection является потокобезопасной», , Я до сих пор не уверен :-( – 30thh

13

Если безопасность потока не упоминается в javadocs, не предполагайте этого!

Серьезно, «нет».

Я бы также предпочел, чтобы javadocs ImmutableList и друзья включали в себя такое очевидное, да-замечательное (так что вам не нужно было бы это делать самостоятельно), потому что «очевидное» не всегда так. На днях я обсуждал scala.List, непреложный список и некоторые неожиданные проблемы, которые он может вызвать, если обменяться между потоками ненадлежащим образом (через гонку данных), о которых люди не думали, потому что они видят слово «неизменный» на жестяной , плюс они приравнивают «неизменяемый» потокобезопасный », поэтому он рассчитывает быть на безопасной стороне, даже когда документирует« очевидные »аспекты безопасности потоков.

2

Согласен с @Dimitris Andreou: определенно не предполагайте безопасность потока, если она не документирована как таковая. Когда вы пойдете на то, чтобы сделать нетривиальный класс threadsafe, вам нужно знать пользователей.

Помимо этого, я думаю, что наиболее распространенный вариант использования для строителя будет ограничен потоком: то есть, как локальная переменная в некотором методе. Если вам нужно несколько потоков для создания списка, на самом деле он неизменен?

Если у вас есть несколько потоков, подаваемых в список, но вы хотите сделать снимок в какой-то момент и сказать «больше никаких изменений в будущем, его неизменяемость», то я бы написал что-то, что берет элементы из этих потоков и замораживает содержимое в новый ImmutableList, когда вы знаете его готовность.