У меня есть словарь, который заполнен однажды в статическом конструкторе и остается неизменным с тех пор. Я хочу, чтобы несколько потоков смогли считать значения из этого набора. Мне нужна какая-либо блокировка здесь?
Согласно документации Microsoft, класс Dictionary может поддерживать несколько читателей одновременно, если коллекция не изменена. Поэтому никаких замков не требуется.
Нет. Блокировка требуется только тогда, когда у вас есть возможность чередовать несколько операций записи или записи с чтениями. Только чтение без каких-либо изменений не дает возможности того, что то, что делает один поток, влияет на то, что делает другой поток.
Обратите внимание, что это вообще не требует записи. Если, скажем, вы используете объект и его чтение каким-то образом изменяет внутреннее состояние объекта в качестве побочного эффекта, тогда вам все равно потребуется блокировка.
Изменить: похоже, в документации говорится, что этот класс потокобезопасен для чтения. Но если это не так, ответ ниже по-прежнему применим, поскольку вы не можете предполагать, что ваш только для чтения доступен только для чтения для класса.
Короткий ответ - да. Если класс не говорит, что это потокобезопасный. Он может делать много вещей, которые не являются потокобезопасными.
Скорее всего, это не вызовет проблемы, но класс может использовать внутренние переменные таким образом, что это может вызвать состояние гонки. Он также может вызывать другие классы, которые не являются потокобезопасными. Если вы не проверите, что код документации говорит, что все в порядке, то предполагать небезопасно.
Например, вы можете подумать, что он доступен только для чтения, но класс, пытающийся ускорить процесс, может кэшировать последний доступный элемент, который включает запись данных. Это может не привести к тому, что вы получите другой элемент, чем ожидалось.
Опять же, я не думаю, что это вероятно, но если класс не говорит, что это потокобезопасно, опасно предполагать.