2013-07-06 6 views
0

Мы знаем, что новый JMM дает гарантии того, что не видел частично сконструированный объект или более одного значения его окончательных полей. http://docs.oracle.com/javase/specs/jls/se7/html/jls-17.html#jls-17.5.2Сериализация, клонирование и заключительные гарантии (неизменность)

Мой вопрос -

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

http://docs.oracle.com/javase/specs/jls/se7/html/jls-17.html#jls-17.5.3

(ДОПОЛНЕНО)

http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6379948 (Bug для десериализации)

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

+0

По крайней мере, для клонирования это, безусловно, * да *. –

+0

после небольшой мысли, я думаю, что клонирование неизменяемого объекта не решит никакой цели. Не было бы никакого сценария, где мне нужно было бы клонировать неизменяемый объект. Я прав в своем предположении? – veritas

+1

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

ответ

0

Если вы передадите объект другому потоку, используя сборку или контейнер с потоком, вы увидите правильное состояние для класса. Это означает встроенные очереди, синхронизированные коллекции, заблокированные коллекции, атомные ссылки или изменчивые.

Чтобы увидеть такую ​​проблему, вам придется использовать доступ, который сам по себе не должен быть потокобезопасным, поскольку любой барьер записи/чтения, который вы используете, даже косвенно, обеспечит правильную инициализацию.

+0

Я говорю об неизменных объектах здесь. Для чего я не нуждаюсь в потокобезопасной коллекции (основное преимущество в контексте неизменяемых объектов). если объект создается через конструктор, у меня есть эта гарантия (из-за окончательной семантики, определяемой новым JMM). Мои вопросы имеют одинаковую гарантию при десериализации и клонировании, и когда такие документы публикуются – veritas

0

При десериализации объекта единственный способ получить ссылку на него - после завершения десериализации, и он возвращается. В этот момент его поля были назначены.

Как правило, единственный способ получить ссылку на неполностью инициализированный объект - это то, что его конструктор суперкласса передает ссылку на this в другой поток.

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

+0

, фактически гарантии не совпадают с эффектами переупорядочения и видимости.Может случиться, что при десериализации я мог видеть два значения конечных полей. см. это http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6379948 – veritas

Смежные вопросы