Каковы гарантии безопасности потоков для Guava ImmutableList.Builder? Джавадоки не говорят.
Является ли Guava ImmutableList.Builder потоком безопасным?
Ответ 1
В то время как классы Guava Immutable являются потокобезопасными, их строителями нет. Для большинства приложений только один поток будет взаимодействовать с любым конкретным экземпляром Builder.
В то время как отсутствие безопасности потока обычно не нужно документировать, такой Javadoc может иметь смысл для сборщиков сборников Nonutable. Люди могут быть удивлены тем, что ImmutableList является потокобезопасным, а ImmutableList.Builder - нет.
Ответ 2
Если безопасность потока не упоминается в javadocs, не предполагайте этого!
Более серьезно, "нет".
Я также предпочел бы, чтобы javadocs ImmutableList и друзья включали в себя такое очевидное, да-замечательное (так что вам не нужно было бы это делать сами), потому что "очевидное" не всегда так. На днях я обсуждал scala.List
, непреложный список и некоторые неожиданные проблемы, которые он может вызвать, если обменяться между потоками ненадлежащим образом (через гонку данных), о которых люди не думали, потому что они видят слово "неизменный" на олово, плюс они приравнивают "неизменяемость == потокобезопасность", поэтому он рассчитывает быть на безопасной стороне, даже когда документирует "очевидные" аспекты безопасности потоков.
Ответ 3
Согласитесь с @Dimitris Andreou: определенно не предполагайте безопасность потоков, если она не задокументирована как таковая. Когда вы приступите к созданию нетривиального класса threadsafe, вы хотите, чтобы пользователи знали его.
Кроме того, я думаю, что наиболее распространенный вариант использования для строителя будет ограничен потоком: то есть, как локальная переменная в некотором методе. Если вам нужно несколько потоков для создания списка, на самом деле он неизменен?
Если у вас есть несколько потоков, подающих в список, но вы хотите сделать снимок в какой-то момент и сказать "больше никаких изменений в будущем, его неизменяемость", то я бы написал что-то, что берет элементы из этих потоков и замораживает содержимое в новый ImmutableList, когда вы его знаете.