Страницы

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

понедельник, 10 июня 2019 г.

Interlocked.Increment внутри lock

Смотрю на код из статьи и не могу понять, в чём смысл использования Interlocked.Increment внутри lock. Зачем он там?
public class Node { public const int InvalidId = -1; private static int s_idCounter;
private int m_id;
public int Id { get { if (m_id == InvalidId) { lock (this) { if (m_id == InvalidId) { m_id = Interlocked.Increment(ref s_idCounter); } } }
return m_id; } } }


Ответ

Представьте, что у вас несколько экземпляров Id в многопоточном приложении и если они используются в разных потоках (каждый - в своем), оба потока могут оказаться одновременно внутри lock, т.к. для блокировки будут использованы разные объекты (this же). Поэтому использование Interlocked здесь не лишнее и оправдано.
Использование Interlocked было бы не нужно, если бы для всех/разных экземпляров для блокировки был использован один какой-то специально созданный статический объект, но это привело бы к некоторой потере скорости при одновременном доступе к разным экземплярам Id

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

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