Почему состояние объекта может быть подмножеством полей в графе объектов с корнями в этом объекте? - PullRequest
3 голосов
/ 13 апреля 2019

Я читаю "Параллелизм Java на практике", сначала написано:

Состояние объекта начинается с его полей. Если все они имеют примитивный тип, поля составляют все состояние.

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

Тогда это говорит:

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

Я не могу найти ответы на два вопроса в книге.

  • Почему это может быть подмножество?
  • При каких условиях поля, доступные для данного объекта, не являются частью состояния этого объекта?

И я полностью запутался в приведенных выше двух цитатах. Это кажется мне противоречивым. Может ли кто-нибудь привести пример, который может показать, что «состояние объекта - это подмножество полей в графе объектов с корнем в этом объекте» и ответить на эти два вопроса?

1 Ответ

2 голосов
/ 14 апреля 2019

Быстрый ответ

Из комментариев ваша путаница выглядит так:

Я думаю, что смысл в том, что «все поля, доступные для объекта, являются частью состояния объекта». Не так ли?

Нет, это не смысл. Это выражается вопросом, который задает автор:

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

На что ответят вскоре после:

Классы коллекции часто демонстрируют форму «разделенного владения», при которой коллекция владеет состоянием инфраструктуры коллекции, а код клиента владеет предметы, хранящиеся в коллекции


Понимание права собственности

Для ясности, владелец определяет, кто может реализовать политику синхронизации для этого состояния.

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

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

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

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

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


Ответ за ..

Почему это может быть подмножество?

Из книги:

Если вы выделяете и заполняете HashMap, вы создаете несколько объектов: объект HashMap, несколько объектов Map.Entry, используемых для реализации HashMap, и, возможно, также другие внутренние объекты.

A HashMap состоит из потенциально множества Map.Entry объектов в форме HashMap#Node.

Поскольку HashMap контролирует взаимодействие клиентов с Node (клиенты не могут создавать новые Node экземпляры, только с помощью таких методов, как HashMap#putVal, который определяет состояние, например Node#hash), состояние Node считается подмножеством HashMap.


Ответ за ...

При каких условиях поля, доступные для данного объекта, не являются частью состояния этого объекта?

Из книги:

Классы коллекции часто демонстрируют форму «разделенного владения», когда коллекция владеет состоянием инфраструктуры коллекции, а клиентский код владеет объекты хранятся в коллекции.


Сервлетам не нужно использовать синхронизацию при вызове set- Attribute и getAttribute, но им, возможно, придется использовать синхронизацию при использовании объектов, хранящихся в ServletContext

Коллекции не контролируют безопасность потоков своих элементов - клиентам, возможно, придется использовать собственную синхронизацию при использовании элементов, полученных из коллекции.

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

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