Страницы

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

среда, 19 декабря 2018 г.

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

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


Ответ

Объект-тип - это указатель на тип объекта. Он недоступен программисту напрямую без всяческих колдунств, поскольку предназначен для самой 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, поскольку большинство создаваемых объектов никогда не используются для синхронизации потоков, а следовательно, затраты времени и памяти на выделение блоков синхронизации для них бессмысленно.
Кроме того индекс блока синхронизации может использоваться в качестве хэш-кода этого объекта в случае, если механизм генерации хэш-кода не был переопределен

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

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