Поскольку вы задаете этот вопрос в контексте многопоточного приложения ASP.NET, вам следует быть предельно осторожным. Проверьте следующий сценарий:
2 пользователя Боб и Алиса вызывают метод getID
одновременно, передавая разные аргументы. Боб проходит Foo
, а Алиса проходит Bar
. Поскольку это первый вызов, переменная _cachedID
еще не инициализирована, поэтому оба переходят в состояние if
, Боб с небольшой задержкой. Итак, Алиса устанавливает статическую переменную the _cachedID
в Bar
, а через микросекунду Bob
устанавливает для нее значение Foo
. Теперь код продолжается, и функция возвращает Foo
для обоих пользователей. Боб, конечно, счастлив, потому что он этого хотел, но Алиса хотела Bar
.
Например, если вы хотите выполнить однократную инициализацию в многопоточной среде, вы можете рассмотреть возможность использования потокобезопасной версии Одноэлементный шаблон.
Мораль этого заключается в том, что вы должны быть чрезвычайно осторожны при работе с общими/статическими данными в приложении ASP.NET. Если вам нужно его использовать, вам нужно правильно синхронизировать доступ к нему, иначе могут произойти очень плохие вещи. И они обычно происходят в рабочей среде, когда к вашему приложению одновременно обращаются несколько пользователей. На вашем локальном ПК все будет работать нормально.
И вернемся к вашему первоначальному вопросу о времени жизни статических полей: оно связано со временем жизни домена приложения.
person
Darin Dimitrov
schedule
02.07.2012