Смотрю на код из статьи и не могу понять, в чём смысл использования 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
Комментариев нет:
Отправить комментарий