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