У вас есть иерархия объектов:
- У вас есть серверы (10)
- На каждом сервере у вас есть процессы (вероятно, только 1 - ваш пул служб / приложений)
- В каждом процессе у вас есть потоки (вероятно, много)
Ваш код будет только запрещать потокам в рамках одного процесса на одном и том же сервере доступ к изменению объекта Cache
одновременно. Вы можете создавать блокировки между процессами и даже серверами, но стоимость значительно возрастает по мере продвижения вверх по иерархии.
Использование оператора lock
на самом деле lock не приводит ни к каким потокам. Однако, если один поток выполняет код внутри блокировки (то есть в блоке кода после оператора lock
), любой другой поток, который хочет взять блокировку и выполнить тот же код, должен ждать, пока первый поток, удерживающий блокировку покидает блок кода и снимает блокировку.
В операторе C # lock
используется критическая секция Windows , которая представляет собой легкий механизм блокировки. Если вы хотите заблокировать процессы, вы можете вместо этого использовать mutex . Для блокировки между серверами вы можете использовать базу данных или общий файл.
Как отметил dkackman, в .NET есть концепция AppDomain, которая является своего рода легковесным процессом. Вы можете иметь несколько доменов приложений на процесс. Оператор C # lock
блокирует только ресурс в пределах одного AppDomain, и правильное описание иерархии будет включать AppDomain ниже процесса и над потоками. Однако довольно часто в процессе используется только один AppDomain, что делает это различие несколько несущественным.