Сериализация в Java: автоматическая безопасность потока? - PullRequest
5 голосов
/ 04 января 2012

Если вы сериализуете объект в Java и отправляете его (через сокет) на узлы в кластере, вы автоматически получаете безопасность потоков?

Скажем, у вас есть кластер, и у каждого узла есть несколько ядер. У сервера есть Java-объект, который он хочет отправить каждому ядру в каждом кластере для обработки. Он сериализует этот объект и отправляет его каждому получателю.

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

Ответы [ 3 ]

4 голосов
/ 04 января 2012

Операция сериализации не является поточно-ориентированной, и не рекомендуется сериализовать объект, который изменяется.Однако любая глубокая копия объекта в том же потоке, процессе или юниверсе является полной копией и не изменяется при изменении оригинала.

Примечание. Если вы отправите обновленный объект снова, вы можете не увидетьобновления, потому что он просто отправляет ссылку на объект.По этой причине вам следует позвонить reset() отправителю, если вы хотите отправить обновление.Другая причина использования reset() состоит в том, чтобы избежать «утечки памяти», поскольку отправитель и получатель будут помнить каждый объект, который они когда-либо писали / читали.

3 голосов
/ 04 января 2012

Благодаря сериализации этот объект автоматически несколько "глубоко копируется", и вы автоматически получаете безопасность потока для этого объекта?

Непонятно, что вы имеете в виду, но ...

  • Процесс сериализации НЕ является потокобезопасным.Например, если один поток сериализует объект, а другой изменяет его, сериализованный объект (т. Е. Последовательность байтов) может не представлять непротиворечивый снимок объекта.

  • После сериализации,последовательность байтов обычно недоступна для потока, который может связываться с ним, поэтому безопасность потока не является проблемой.

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

    Не имеет значения, десериализуются ли объекты вто же адресное пространство, что и при сериализации.Десериализация создает новые объекты.Они копии оригинальных объектов.

1 голос
/ 04 января 2012

Определенно это «потокобезопасный» (в том смысле, что вы его определяете).Сериализация по определению является глубокой копией объекта, и каждый работник получит свой объект.

...