Что такое "не полностью построенный объект"?

Я не думаю, что Visual Studio поддерживает эту функцию внутренне, поскольку она, кажется, использует обычный способ Ctrl + Right и Ctrl + Left работать в среде Windows. Но это, вероятно, возможно с каким-то расширением или плагином.

24
задан Joonas Pulakka 25 March 2010 в 09:06
поделиться

3 ответа

Конец конструктора - это особое место с точки зрения параллелизма по отношению к конечным полям. Из раздела 17.5 Спецификации языка Java:

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

Модель использования полей final проста. Задайте последние поля для объекта в конструкторе этого объекта . Не записывайте ссылку на создаваемый объект в месте, где другой поток может видеть его до того, как конструктор объекта будет завершен. Если это выполняется, то , когда объект видит другой поток, этот поток всегда будет видеть правильно сконструированную версию последних полей этого объекта.Он также будет видеть версии любого объекта или массива , на которые ссылаются те последние поля , которые, по крайней мере, так же актуальны, как и последние поля .

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

Что касается того, что происходит, я подозреваю, что в самом конце конструктора есть неявный барьер памяти, гарантирующий, что все потоки «видят» новые данные; без применения этого барьера памяти могут возникнуть проблемы.

17
ответ дан 28 November 2019 в 21:47
поделиться

Другая проблема возникает при создании подкласса ThisEscape, и дочерний класс вызывает этот конструктор. Неявная ссылка this в EventListener будет иметь не полностью сконструированный объект.

6
ответ дан 28 November 2019 в 21:47
поделиться

Между завершением registerListener и возвратом конструктора проходит небольшой, но конечный промежуток времени. В это время может войти другой поток и попытаться вызвать doSomething (). Если среда выполнения не вернулась прямо к вашему коду в то время, объект мог находиться в недопустимом состоянии.

На самом деле я не уверен в java, но могу вспомнить один пример, где, возможно, среда выполнения перемещает экземпляр, прежде чем вернуться к вам.

Даю вам небольшой шанс.

2
ответ дан 28 November 2019 в 21:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: