Страницы

Поиск по вопросам

воскресенье, 29 декабря 2019 г.

Объект-тип и индекс блока синхронизации

#c_sharp


Начал читать книгу Рихтера и наткнулся там на такие понятия, как объект-тип и индекс
блока синхронизации. Не нашел там четкого определения. 

Дайте определения этим понятиям, расскажите для чего они нужны, приведите примеры.
    


Ответы

Ответ 1



Объект-тип - это указатель на тип объекта. Он недоступен программисту напрямую без всяческих колдунств, поскольку предназначен для самой CLR Индекс блока синхронизации предназначен для целого ряда целей. Но основная его задача - это обеспечение работы объекта в условиях многопоточности. Вероятно, вам знакомо такое ключевое слово, как lock. Оно используется для синхронизации доступа к объекту из нескольких потоков (то есть позволяет выполнять некий блок кода только одним потоком, заставляя остальные потоки ждать своей очереди). Пример: private int _i; private object _syncObject = new object(); public int Increment() { lock (_syncObject) { return ++_i; // только один поток сможет выполнить эту инструкцию } } Однако сам lock - это лишь синтаксический сахар, разворачивающийся в нечто наподобие private int _i; private object _syncObject = new object(); public int Increment() { bool acquired = false; try { Monitor.Enter(_syncObject, ref acquired); return ++_i; } finally { if (acquired) Monitor.Exit(_syncObject); } } При необходимости синхронизации CLR создает структуру, которая называется блоком синхронизации. Этот блок содержит слабую ссылку на объект синхронизации ("слабая" означает, что сам объект, на который указывает эта ссылка, может быть удален сборщиком мусора, невзирая на эту ссылку) и ссылку на монитор, который используется для синхронизации. Сам блок синхронизации хранится в массиве, который называется таблицей блоков синхронизации. А индекс блока синхронизации - это индекс в таблице блоков синхронизации, по которому расположен соответствующий данному объекту блок синхронизации. При этом для подавляющего большинства объектов никакого блока синхронизации не создается вообще, а индекс блока синхронизации равен -1, поскольку большинство создаваемых объектов никогда не используются для синхронизации потоков, а следовательно, затраты времени и памяти на выделение блоков синхронизации для них бессмысленно. Кроме того индекс блока синхронизации может использоваться в качестве хэш-кода этого объекта в случае, если механизм генерации хэш-кода не был переопределен

Ответ 2



В этой книге даны четкие определения этих понятий, возможно вы просто еще не дошли до главы, где эти понятия подробно рассматриваются, либо же вы читали не внимательно. Как уже не раз упоминалось в этой книге, при создании объекта в куче с ним связываются два дополнительных служебных поля. Первое поле — указатель на объект-тип — содержит адрес этого объекта в памяти. Вто- рое поле содержит индекс блока синхронизации (sync block index), то есть индекс в массиве таких блоков Перечитайте главу про типы, там подробно.

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

Отправить комментарий