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

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

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

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

Редактировать: Почему так много отрицательных голосов? Никто еще не смог объяснить, как JAXB обеспечивает эту, казалось бы, невозможную задачу.

1 ответ

Решение

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

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

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

Как вы можете быть уверены, что реализация JAXB действительно делает не то, что нужно?

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

  • Ваши потоки разделяют объекты обработчика JAXB.

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

РЕДАКТИРОВАТЬ:

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

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

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

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

Другие вопросы по тегам