Я не буду исследовать различные «факты» в вашем вопросе, я просто перефразирую:
"Без ссылок это неправда!"
Тем не менее, любой, кто имеет дело с потоками в Java в наши дни, должен фактически попытаться, чтобы избежать непреднамеренного установления отношений происходит-до и происходит-после. Любое использование volatile переменной, синхронизированного блока, объекта Lock или атомарной переменной должно установить такую связь. Это немедленно включает блокирующие очереди, синхронизированные хеш-карты и множество других мелочей.
Почему вы так уверены, что реализация JAXB на самом деле делает что-то не так?
Тем не менее, в то время как объекты, полученные из JAXB, примерно так же безопасны, как и любой объект Java, после того, как JAXB закончит с ними, сами методы сортировки/демаршаллинга не являются потокобезопасными. Я считаю, что вам не о чем беспокоиться, если:
Ваши потоки совместно используют объекты обработчика JAXB.
Вы передаете объекты между своими потоками без синхронизации: явно нездоровая практика, независимо от того, откуда эти объекты...
ИЗМЕНИТЬ:
Теперь, когда вы отредактировали свой вопрос, мы можем дать более конкретный ответ:
Сгенерированные JAXB объекты так же потокобезопасны, как и любой другой объект Java, что вовсе не так. Прямой вызов конструктора сам по себе также не обеспечивает потокобезопасности. Без установленной связи происходит до JVM может возвращать частично инициализированные объекты во время вызова new
.
Есть есть способы, а именно с помощью использования полей final и неизменяемых объектов, чтобы избежать этой ловушки , но это довольно сложно сделать правильно, особенно с JAXB, и на самом деле это не решает проблему распространения правильной ссылки на объект, чтобы все потоки смотрели на один и тот же объект.
Итог: вы должны безопасно перемещать данные между своими потоками с помощью правильных методов синхронизации. Не предполагайте ничего о лежащей в основе реализации, кроме того, что четко задокументировано. Но даже в этом случае лучше перестраховаться и кодировать оборонительно — обычно это в любом случае приводит к более четкому взаимодействию между потоками. Если на более позднем этапе профилировщик обнаружит проблему с производительностью, тогда вам следует подумать о точной настройке кода синхронизации.
person
thkala
schedule
25.03.2012