Является ли JAXB безопасным для одновременного доступа (как это делается)

Я предполагаю, что JAXB вызывает конструктор с нулевым аргументом, а затем начинает заполнять энергонезависимые поля и добавлять данные в списки.

В моем собственном коде: сразу после выполнения этого действия (десортировки) сгенерированные bean-компоненты депортируются в некоторые рабочие потоки с помощью какого-либо метода добавления, но не через конструктор или каким-либо другим способом, который вызовет запуск модели памяти. очистить и обновить данные в общей области и из нее.

Это безопасно? Или JAXB делает какой-то магический трюк за кулисами? Я не могу придумать никакого способа на языке программирования Java, который мог бы заставить все быть видимым для всех потоков. Должен ли пользователь bean-компонентов, сгенерированных JAXB, беспокоиться о том, что поля могут быть не установлены явно в параллельной настройке?

Изменить. Почему так много голосов против? Никто еще не мог объяснить, как JAXB обеспечивает выполнение этой, казалось бы, невыполнимой задачи.


person Franz Kafka    schedule 25.03.2012    source источник
comment
... но не с помощью конструктора или каким-либо другим способом, который заставит модель памяти сбрасывать и повторно извлекать данные в общую область и из нее: откуда вы это знаете? Это просто безосновательное предположение.   -  person user207421    schedule 26.03.2012
comment
Потому что я бросаю их в поток в своем коде. С чего бы это спекуляции?   -  person Franz Kafka    schedule 26.03.2012
comment
Потому что вы добавляете что в поток своего кода? Какой у Вас вопрос? Вы вызвали бурю спекуляций, не представив никаких доказательств. К вашему сведению, JAXB не обладает магическими способностями; он просто создает объекты и вызывает для них геттеры и сеттеры.   -  person user207421    schedule 26.03.2012
comment
@EJP серьезно, что с тобой не так? Если не знаете ответа, то ничего не пишите. И если вы знаете ответ, то ответьте или почувствуйте наглость и держите его при себе. Ваше непродуктивное неверное истолкование моего вопроса никому не поможет. вы что нить кидаете в свой код? Ответ: Мой код берет bean-компоненты, заполненные JAXB, и бросает их в поток, как это может быть так сложно понять?   -  person Franz Kafka    schedule 28.03.2012


Ответы (1)


Я не буду исследовать различные «факты» в вашем вопросе, я просто перефразирую:

"Без ссылок это неправда!"

Тем не менее, любой, кто имеет дело с потоками в Java в наши дни, должен фактически попытаться, чтобы избежать непреднамеренного установления отношений происходит-до и происходит-после. Любое использование volatile переменной, синхронизированного блока, объекта Lock или атомарной переменной должно установить такую ​​связь. Это немедленно включает блокирующие очереди, синхронизированные хеш-карты и множество других мелочей.

Почему вы так уверены, что реализация JAXB на самом деле делает что-то не так?

Тем не менее, в то время как объекты, полученные из JAXB, примерно так же безопасны, как и любой объект Java, после того, как JAXB закончит с ними, сами методы сортировки/демаршаллинга не являются потокобезопасными. Я считаю, что вам не о чем беспокоиться, если:

  • Ваши потоки совместно используют объекты обработчика JAXB.

  • Вы передаете объекты между своими потоками без синхронизации: явно нездоровая практика, независимо от того, откуда эти объекты...

ИЗМЕНИТЬ:

Теперь, когда вы отредактировали свой вопрос, мы можем дать более конкретный ответ:

Сгенерированные JAXB объекты так же потокобезопасны, как и любой другой объект Java, что вовсе не так. Прямой вызов конструктора сам по себе также не обеспечивает потокобезопасности. Без установленной связи происходит до JVM может возвращать частично инициализированные объекты во время вызова new.

Есть есть способы, а именно с помощью использования полей final и неизменяемых объектов, чтобы избежать этой ловушки , но это довольно сложно сделать правильно, особенно с JAXB, и на самом деле это не решает проблему распространения правильной ссылки на объект, чтобы все потоки смотрели на один и тот же объект.

Итог: вы должны безопасно перемещать данные между своими потоками с помощью правильных методов синхронизации. Не предполагайте ничего о лежащей в основе реализации, кроме того, что четко задокументировано. Но даже в этом случае лучше перестраховаться и кодировать оборонительно — обычно это в любом случае приводит к более четкому взаимодействию между потоками. Если на более позднем этапе профилировщик обнаружит проблему с производительностью, тогда вам следует подумать о точной настройке кода синхронизации.

person thkala    schedule 25.03.2012
comment
Без ссылок это неправда! Это не факты в моем вопросе. Это вопрос, ожидающий ответа с фактами. Я не знаю, как JAXB справляется с этой проблемой, поэтому и спрашиваю. Это вопрос, а не ответ. - person Franz Kafka; 26.03.2012