문제

CF 앱에서 Double Checked Locking 버전을 사용했습니다 (Double Checked Locking이 무엇인지 알기 전에).

본질적으로, 나는 물체의 존재를 확인합니다. 존재하지 않으면 잠금 (일반적으로 이름이 지정된 잠금 장치 사용)을 잠그고 객체를 만들기 전에 다시 존재를 확인합니다. 나는 이것이 여러 객체가 생성되고 시스템의 과도한 잠금을 중지하는 깔끔한 방법이라고 생각했습니다.

이것은 과도한 잠금이없고 객체 복제가 생성되지 않는다는 점에서 작동하는 것 같습니다. 그러나 나는 최근에 그것을 배웠다 Java에서는 이중 점검 잠금 장치가 작동하지 않습니다, 내가 알지 못하는 것은 CF에서 CF 스레드와 자물쇠가 기본 Java 스레드 및 잠금과 동일하지 않다는 것을 보는 것입니다.

올바른 솔루션이 없습니다

다른 팁

Ben Doom이 Java에 대해 말한 내용을 더하기 위해, 이것은 콜드 펜션에서 상당히 표준적인 관행, 특히 응용 프로그램 변수를 설정하는 응용 프로그램 초기화 루틴과 관련이 있습니다.

적어도 하나의 잠금 장치가 없으면 웹 응용 프로그램에 초기 히트를 사용하면 모두 응용 프로그램 변수를 동시에 초기화합니다. 이것은 귀하의 응용 프로그램이 이것을 보증하기에 충분히 바쁘다고 가정합니다. 신청서가 처음 시작될 때 신청서가 바쁠 경우에만 위험이 있습니다.

첫 번째 잠금은 한 번에 하나의 요청 만 변수를 초기화하는지 확인합니다.

첫 번째 내부에 포함 된 두 번째 잠금 잠금 장치는 초기화 코드의 끝에 정의 된 변수가 응용 프로그램과 같이 존재하는지 확인합니다. 존재하면 사용자가 쫓겨납니다.

이중 잠금 패턴은 바쁜 사이트에서 내 피부를 절약했지만, 매우 바쁜 사이트에서는 응용 프로그램의 초기 히트 히트 요청 대기열이 너무 높아서 너무 빨리 올라가 서버가 충돌 할 수 있습니다. 아이디어는 요청이 첫 번째 히트를 기다리고 있는데, 이는 느리게 진행되며, 두 번째는 첫 번째 Clock에 들어가서 빠르게 거부됩니다. 대기열에 수백 또는 수천 개의 요청이있을 때마다 밀리 초마다 성장하면서 모두 첫 번째 Clock 블록으로 퍼지고 있습니다. 해결책은 첫 번째 Clock에서 매우 낮은 시간 초과를 설정하고 잠금 시간 초과 오류를 던지거나 오리를 던지지 않는 것입니다.

마지막으로, 내가 설명한이 동작은 application.cfc의 ColdFusion 7의 OnApplicationStart () 메소드로 사용되지 않았습니다. OnApplicationStart ()를 사용하는 경우 응용 프로그램이 시작 루틴을 전혀 잠그지 않아야합니다. Application.cfc는 이미 잘 잠겨 있습니다.

결론적으로, 콜드 펜션에서 두 번 확인 된 잠금이 작동합니다. 몇 가지 특정 상황에서 도움이되지만 올바르게 수행하십시오. Java의 스레딩 모델과는 달리 왜 작동하는지에 대한 개략도를 모르겠습니다. Coldfusion 서버의 백그라운드에서 일종의 조회 테이블을 수동으로 확인할 가능성이 있습니다.

Java는 ThreadSafe이므로 자물쇠가 필요하지 않은 것처럼 작동하지 않는 것은 그리 많지 않습니다. 기본적으로 CF 6+에서는 자바의 제어 (예 : 파일) 외부에 존재하는 인종 조건을 방지하거나 객체를 생성/알링하기 위해 잠금 장치가 필요합니다.

다른 벌레 캔을 열기 위해 ...

콜드 스프링과 같은 종속성 주입 라이브러리를 사용하여 객체를 추적하고 원형 종속성을 방지하지 않겠습니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top