Да и нет, для разных значений «потокобезопасности» (извините за тупой ответ). Конструкция не является поточно-ориентированной, но как только конструктор завершит работу и, предположив, что это произошло правильно, он станет неизменным и безопасным для потоков.
Во время построения параметр map
может быть изменен другим потоком между вызовом map.entrySet
и вызовами entry.getKey
и entry.getValue
. Из Javadoc Map.entrySet
. Это может привести к неопределенному поведению.
Из java.util.Map
Javadoc для entrySet
:
Возвращает заданный вид сопоставлений.
содержится в этой карте. Каждый элемент в
возвращенный набор является Map.Entry.
набор поддерживается картой, поэтому изменения
на карту отражаются в наборе,
и наоборот. Если карта изменена
в то время как итерация по множеству находится в
прогресс, результаты итерации
не определены. Набор поддерживает
удаление элемента, который удаляет
соответствующее отображение с карты,
через Iterator.remove, Set.remove,
удалить все, сохранить все и очистить
операции. Это не поддерживает
операции добавления или добавления всех.
Таким образом, в зависимости от того, у кого есть ссылка на карту, и как они манипулируют ею в потоках, и сколько времени занимает копирование элементов, у вас может быть неопределенное поведение и, возможно, различное поведение в разных выполнениях программы. *
Кажется, вы мало что можете сделать, чтобы убедиться, что он правильно построен из этого класса (поскольку, например, ConcurrentHashMap
имеет аналогичную проблему). Если остальная часть вашего кода может гарантировать, что конструктору дана поточно-ориентированная карта, он также будет поточно-ориентированным, но это более широкий охват, чем вы просили.
Однако, как только конструктор завершает работу и он безопасно публикуется [1], он будет неизменным и безопасным для потоков - хотя и поверхностным способом - если ключи или записи являются изменяемыми, это портит ваш класс, делая его не неизменным и не потокобезопасным. Таким образом, если ваши ключи String
и ваши значения Integer
, он будет неизменным и, следовательно, потокобезопасным. Если, однако, ваши ключи являются объектами, подобными bean-объектам, с сеттерами, а ваши значения представляют собой другие изменяемые типы коллекций, то ваш класс не является неизменным. Я склонен называть это условием "черепахи внизу".
По сути, ваш класс может быть неизменяемым и поточно-ориентированным при определенных условиях, выходящих за рамки охвата, не охваченных вашим вопросом.
[1] Ваш класс в настоящее время будет безопасно опубликован, но если, например, он станет вложенным классом или вы передадите ссылку this
на другой метод во время конструктора, это может стать небезопасной публикацией.