Основная проблема с кодом выше состоит в том, что он блокирует доступ к _failedTests
только тогда, когда поток получает словарь или устанавливает его. Только одна нить может одновременно получить ссылку на словарь, но как только нить имеет ссылку на словарь, она может читать и манипулировать ею, не будучи ограниченной блокировками.
Это правильный способ безопасного добавления
проваленный словарь в словаре?
Нет, нет, если два потока пытаются добавить в словарь одновременно. Также, если вы ожидаете, что чтение и запись происходят в определенном порядке.
Этот потокобезопасен?
Зависит от того, что вы подразумеваете под безопасным потоком , но нет, не под любым разумным определением.
FailedTests.Add называется ВНУТРИ
заблокировать или за пределами блокировки?
Получение словаря (метод доступа get
) происходит внутри блокировки. Этот код вызывает Add
после снятия блокировки.
Можете ли вы объяснить, почему это правильно / безопасно или почему нет?
Если в вашем словаре одновременно работают несколько потоков, вы не можете предсказать порядок, в котором эти потоки изменят свое содержимое, и вы не можете контролировать, когда произойдет чтение.