Работает ли «Двойная проверка блокировки» в ColdFusion? - PullRequest
0 голосов
/ 16 февраля 2009

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

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

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

Ответы [ 3 ]

6 голосов
/ 17 февраля 2009

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

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

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

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

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

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

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

2 голосов
/ 16 февраля 2009

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

0 голосов
/ 18 февраля 2009

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

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

...