Каковы гарантии безопасности резьбы для ImmutableList.Builder от Guava? Джавадоки не говорят.Является ли Guava ImmutableList.Builder потоком безопасным?
ответ
В то время как классы Guava Immutable являются потокобезопасными, их строителями нет. Для большинства приложений только один поток будет взаимодействовать с любым конкретным экземпляром Builder.
Хотя отсутствие безопасности потока обычно не требуется документировать, такой Javadoc может иметь смысл для сборщиков сборных материалов. Люди могут быть удивлены тем, что ImmutableList является потокобезопасным, а ImmutableList.Builder - нет.
Если безопасность потока не упоминается в javadocs, не предполагайте этого!
Серьезно, «нет».
Я бы также предпочел, чтобы javadocs ImmutableList и друзья включали в себя такое очевидное, да-замечательное (так что вам не нужно было бы это делать самостоятельно), потому что «очевидное» не всегда так. На днях я обсуждал scala.List
, непреложный список и некоторые неожиданные проблемы, которые он может вызвать, если обменяться между потоками ненадлежащим образом (через гонку данных), о которых люди не думали, потому что они видят слово «неизменный» на жестяной , плюс они приравнивают «неизменяемый» потокобезопасный », поэтому он рассчитывает быть на безопасной стороне, даже когда документирует« очевидные »аспекты безопасности потоков.
Согласен с @Dimitris Andreou: определенно не предполагайте безопасность потока, если она не документирована как таковая. Когда вы пойдете на то, чтобы сделать нетривиальный класс threadsafe, вам нужно знать пользователей.
Помимо этого, я думаю, что наиболее распространенный вариант использования для строителя будет ограничен потоком: то есть, как локальная переменная в некотором методе. Если вам нужно несколько потоков для создания списка, на самом деле он неизменен?
Если у вас есть несколько потоков, подаваемых в список, но вы хотите сделать снимок в какой-то момент и сказать «больше никаких изменений в будущем, его неизменяемость», то я бы написал что-то, что берет элементы из этих потоков и замораживает содержимое в новый ImmutableList, когда вы знаете его готовность.
У вас есть доказательство? В статье «Неизменяемые коллекции» (https://github.com/google/guava/wiki/ImmutableCollectionsExplained) говорится: «Неизменяемые объекты могут использоваться многими потоками», но в нем явно не указано, что «Guava Immutable Collection является потокобезопасной», , Я до сих пор не уверен :-( – 30thh