Важно понимать, что блокировка (m_Hash) НЕ не позволяет хешу использовать другой код. Он только предотвращает запуск другого кода, который также использует m_Hash в качестве объекта блокировки.
Одна из причин использования опции A заключается в том, что у классов, скорее всего, есть закрытые переменные, которые вы будете использовать внутри оператора блокировки. Гораздо проще просто использовать один объект, который вы используете для блокировки доступа ко всем из них, вместо того, чтобы пытаться использовать более тонкие зернистые блокировки для блокировки доступа только к тем членам, которые вам понадобятся. Если вы попытаетесь использовать более мелкозернистый метод, вам, вероятно, придется взять несколько блокировок в некоторых ситуациях, а затем вам нужно убедиться, что вы всегда берете их в одном и том же порядке, чтобы избежать тупиков.
Другая причина использования опции A заключается в том, что существует вероятность того, что ссылка на m_Hash будет доступна за пределами вашего класса. Возможно, у вас есть открытое свойство, предоставляющее доступ к нему, или вы объявляете его защищенным, и его могут использовать производные классы. В любом случае, когда внешний код имеет ссылку на него, возможно, что внешний код будет использовать его для блокировки. Это также открывает возможность взаимоблокировок, поскольку у вас нет возможности контролировать или знать, в каком порядке будет принята блокировка.