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

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

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

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

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

1 Ответ

3 голосов
/ 26 марта 2012

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

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

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

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

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

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

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

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...