Работает ли «двойная проверка блокировки» в ColdFusion?

StackOverflow https://stackoverflow.com/questions/552839

Вопрос

Я использовал версию блокировки с двойной проверкой в ​​своем приложении CF (до того, как узнал, что такое блокировка с двойной проверкой).

По сути, я проверяю существование объекта.Если его нет, я блокирую (обычно используя именованную блокировку) и, прежде чем попытаться создать объект, снова проверяю его существование.Я подумал, что это отличный способ остановить создание нескольких объектов и предотвратить чрезмерную блокировку системы.

Кажется, это работает, поскольку не происходит чрезмерной блокировки и не создаются дубликаты объектов.Однако недавно я узнал, что Двойная проверка блокировки не работает в Java, чего я не знаю, так это того, справедливо ли это для CF, поскольку потоки и блокировки CF не совсем совпадают с собственными потоками и блокировками Java.

Нет правильного решения

Другие советы

В дополнение к тому, что Бен Дум сказал о Java, это довольно стандартная практика в ColdFusion, особенно в отношении процедуры инициализации приложения, в которой вы настраиваете переменные приложения.

Не имея хотя бы одной блокировки, вы позволяете всем первоначальным обращениям к вашему веб-приложению одновременно инициализировать переменные приложения.Это предполагает, что ваше приложение достаточно занято, чтобы гарантировать это.Опасность существует только в том случае, если ваше приложение занято в момент его первого запуска.

Первая блокировка гарантирует, что только один запрос одновременно инициализирует ваши переменные.

Вторая блокировка, встроенная в первую, проверит, существует ли переменная, определенная в конце вашего кода инициализации, например application.started.Если он существует, пользователь удаляется.

Шаблон двойной блокировки спас мою шкуру на загруженных сайтах, однако на ОЧЕНЬ загруженных сайтах очередь запросов на завершение первоначального обращения приложения может подняться слишком высоко и слишком быстро и привести к сбою сервера.Идея в том, что запросы ждут первого хита, который медленный, затем второй врывается в первый cflock и быстро отклоняется.Поскольку в очереди находятся сотни или тысячи запросов, которые растут каждую миллисекунду, все они направляются к первому блоку cflock.Решение состоит в том, чтобы установить очень маленький тайм-аут для первой синхронизации и не выдавать (или перехватывать и уклоняться) ошибку тайм-аута блокировки.

И последнее замечание: описанное мной поведение устарело с помощью метода onApplicationStart() ColdFusion 7 вашего Application.cfc.Если вы используете onApplicationStart(), вам вообще не следует блокировать процедуру инициализации вашего приложения.Application.cfc уже хорошо заблокирован.

В заключение: да, дважды проверенная блокировка работает в ColdFusion.Это полезно в некоторых определенных обстоятельствах, но делайте это правильно.Я не знаю схемы того, почему она работает в отличие от модели потоков Java, скорее всего, она вручную проверяет какую-то таблицу поиска в фоновом режиме вашего сервера ColdFusion.

Java является потокобезопасным, поэтому ваши блокировки не столько не будут работать, сколько то, что они не нужны.По сути, в CF 6+ блокировки необходимы для предотвращения состояний гонки или создания/изменения объектов, существующих вне контроля Java (например, файлов).

Открыть еще одну банку с червями...

Почему бы вам не использовать библиотеку внедрения зависимостей, например ColdSpring, для отслеживания ваших объектов и предотвращения циклических зависимостей.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top