Является ли JAXB безопасным для одновременного доступа (как это делается)
Я предполагаю, что JAXB вызывает конструктор с нулевым аргументом, а затем начинает заполнять энергонезависимые поля и добавляет элементы в списки.
В моем собственном коде: Сразу после этого (unmarshalling) сгенерированные bean-компоненты депортируются в некоторые рабочие потоки через некоторый метод add, но не через конструктор или каким-либо другим способом, который заставил бы модель памяти сбрасывать и повторно получать данные и из общей зоны.
Это безопасно? Или JAXB делает какой-то магический трюк за кулисами? Я не могу придумать ни одного способа на языке программирования Java, который мог бы заставить все быть видимым для всех потоков. Должен ли пользователь сгенерированных JAXB компонентов беспокоиться о полях, которые, возможно, не выставлены в параллельной установке?
Редактировать: Почему так много отрицательных голосов? Никто еще не смог объяснить, как JAXB обеспечивает эту, казалось бы, невозможную задачу.
1 ответ
Я не буду исследовать различные "факты" в вашем вопросе, я просто перефразирую:
"Без ссылок это не правда!"
Тем не менее, любой, кто имеет дело с потоками в Java в эти дни, должен будет на самом деле попытаться избежать непреднамеренного установления отношений " до и после". Любое использование энергозависимой переменной, синхронизированного блока, объекта Lock или атомарной переменной обязательно должно установить такую взаимосвязь. Это сразу приводит к блокированию очередей, синхронизированным хэш-картам и множеству других фрагментов.
Как вы можете быть уверены, что реализация JAXB действительно делает не то, что нужно?
Тем не менее, в то время как объекты, полученные из JAXB, примерно так же безопасны, как и любой объект Java, после того, как JAXB с ними работает, сами методы маршаллинга / демаршаллинга не являются поточно-ориентированными. Я считаю, что вам не нужно беспокоиться, если:
Ваши потоки разделяют объекты обработчика JAXB.
Вы передаете объекты между потоками без синхронизации. Совершенно нездоровая практика, независимо от того, откуда эти объекты...
РЕДАКТИРОВАТЬ:
Теперь, когда вы отредактировали свой вопрос, мы можем дать более конкретный ответ:
Генерируемые JAXB объекты так же поточно-ориентированы, как и любой другой объект Java, что совсем не так. Прямой вызов конструктора сам по себе не обеспечивает никакой безопасности потоков. Без установленного отношения " до того" JVM может возвращать частично инициализированные объекты в тот момент, когда new
называется.
Есть способы, а именно с помощью конечных полей и неизменяемых объектов, избежать этой ловушки, но это довольно сложно сделать правильно, особенно с JAXB, и это на самом деле не решает проблему распространения правильной ссылки на объект, так что все темы смотрят на один и тот же объект.
Итог: вы можете безопасно перемещать данные между потоками, используя правильные методы синхронизации. Не предполагайте ничего о базовой реализации, за исключением того, что четко задокументировано. Даже в этом случае лучше соблюдать осторожность и защищать код - обычно это в любом случае приводит к более четкому взаимодействию между потоками. Если на более позднем этапе профилировщик указывает на проблему с производительностью, вам следует задуматься о тонкой настройке кода синхронизации.