Безопасен ли поток Gumm's ImmutableList.Builder? - PullRequest
11 голосов
/ 20 мая 2010

Каковы гарантии безопасности потоков для Guava ImmutableList.Builder? Джавадоки не говорят.

Ответы [ 3 ]

31 голосов
/ 22 мая 2010

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

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

13 голосов
/ 20 мая 2010

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

А если серьезно, то нет.

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

2 голосов
/ 26 января 2011

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...