Что такое публикация объектов и зачем нам это нужно?

#java

#java

Вопрос:

Во время одного из моих собеседований на должность разработчика Java мне задали вопрос:

Что такое публикация объектов и зачем нам это нужно?

И я не уверен, что знаю правильный ответ:

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

Я прав? Пожалуйста, поправьте меня, если я ошибаюсь. Я искал спецификацию языка Java, но не нашел ничего, что однозначно отвечало бы на этот вопрос.

Подсказка: Вопрос намеренно сформулирован нестрогим и точным образом — в этом его подвох.

Ответ №1:

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

Классический текст по этому (и многим другим вопросам, связанным с потоками) — это параллелизм Java на практике. Если у вас нет копии этого документа и вы не можете найти в Google пиратский PDF-файл, я бы не советовал вам это делать, и даже если вы это сделаете или сможете, вам следует прислушаться к совету могущественного стандарта безопасного кодирования CERT Oracle для Java о том, что вы не публикуете частично инициализированные объекты.

Комментарии:

1. Спасибо. Из Java Concurrency in Practice , глава 3, параграф 3.2: Публикация объекта означает предоставление его коду за пределами его текущей области видимости, например, путем сохранения ссылки на него там, где другой код может ее найти, возврата его из непубличного метода или передачи его методу другого класса.

2. Я принимаю ваш ответ, потому что он указал мне на наиболее точный ответ на мой вопрос. Еще раз спасибо.

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

Ответ №2:

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

Но с точки зрения определения это не что иное, как создание экземпляра объекта, что снова означает, что объект опубликован

Комментарии:

1. Я не верю, что вы считаете это «опубликованным», пока что-то за пределами текущей области не сможет получить к нему доступ. JCIP — 3.2 Публикация и экранирование — Публикация объекта означает предоставление его коду доступа за пределами его текущей области видимости, например, путем сохранения ссылки на него там, где ее может найти другой код, Блох, Джошуа; Гетц, Брайан; Пайерлс, Тим; Боубир, Джозеф; Холмс, Дэвид; Леа, Дуг (2006-05-09). Параллелизм Java на практике (местоположения Kindle 1230-1231). Pearson Education (США). Kindle Edition.

Ответ №3:

«Публикация объектов» не является устоявшимся техническим термином, и уж точно не в экосистеме Java. Кажется, это часть названия Zope, веб-фреймворка Python.

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

Комментарии:

1. Я знаю, что этот вопрос не является строгим и точным. Но именно столько вопросов было задано в том интервью. Суть этого заключалась в том, чтобы посмотреть, сможет ли кандидат разобраться в контексте вопроса, учитывая только намеки на то, о чем может быть вопрос. Мне кажется, что это вопрос такого рода, но я все еще не могу четко понять контекст по этому вопросу.

2. -1, потому что «публикация» (часто «публикация») является устоявшимся техническим термином в мире Java, обычно используемым в контексте » безопасной публикации «, а «публикация объектов» достаточно близка, чтобы я ожидал, что кто-то, кто знал об этом, распознает его как синоним. Я думаю, что широкое использование термина связано с его использованием в JCIP , но я сомневаюсь, что он был придуман там.

3. На самом деле, статья Zope в Википедии — это то, что привело меня сюда. В нем утверждается, что Zope — это «первая система, использующая ныне распространенную методологию публикации объектов для Интернета». Я нашел утверждение о том, что OP является «распространенным» в Интернете, довольно сомнительным, поэтому я начал искать тему в Google. Это, очевидно, что-то другое. Не совершайте ошибку, предполагая, что две вещи, описываемые одними и теми же словами, должны быть одним и тем же.