То, что вы делаете здесь, является «худшей практикой» во многих отношениях.
Во-первых, нет никакой гарантии, что другие потоки, имеющие ссылку на эту хеш-таблицу, также блокируют ее перед тем, как прочитать или записать. Вот почему эта техника так плоха; эту гарантию трудно сделать.
Во-вторых, нет никакой гарантии, что другие потоки, имеющие ссылку на этот экземпляр хеш-таблицы, не блокируют его и не могут разблокировать его , потому что они глючат или враждебны. Вы, возможно, поручаете другим людям ответственность за правильность вашего кода, и это опасное положение. Хорошее правило - «никогда не блокируйте все, что может видеть внешний код». Никогда не блокируйте «это», никогда не блокируйте объект Type и т. Д. Есть времена, чтобы сделать исключение из этого правила, но я бы хотел вескую причину.
Правильнее всего сделать здесь, во-первых, использовать ConcurrentDictionary. Если вы не можете этого сделать, я бы написал обертку вокруг HashTable:
sealed class ThreadSafeHashTable
{
private readonly HashTable hashTable = new HashTable();
public void Add(object key, object value)
{
lock(this.hashTable)
{
...
Теперь блокировка (1) всегда выполняется каждый раз, когда вызывается Add, и (2) только код в этом классе может взять блокировку, потому что заблокированный объект является закрытым и никогда не теряется.
Только если бы вы не смогли сделать ни одну из этих вещей, я бы сделал это трудным путем. Если вы хотите сделать это трудным путем, вам придется отслеживать каждое место, где хеш-таблицу можно использовать , и убедиться, что записан правильный код блокировки.