Это ImmutableList гуава это.Строитель потокобезопасен?

каковы гарантии безопасности потока для неизменяемого списка Guava.Строитель? В Javadoc не сказать.

3 ответов


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

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


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

более серьезно, "нет".

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


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

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

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