我已经使用了一个版本的CF我的应用双重检查锁定模式(之前,我知道双重检查锁定是什么)。

基本上,我检查的对象是否存在等。如果它不存在,我锁定(通常使用一个名为锁)之前,我尝试创建我的所有脑干再次检查的对象。我认为这是一种巧妙的方法停止正在创建多个对象并在系统停止过度的锁定。

这似乎工作,在不存在没有得到过多的创建锁定和对象重复。不过,我最近发现双重检查锁定在工作不到风度Java的,什么我不知道的是,如果该持有CF真的,看到CF线程和锁都不太一样的本地Java线程和锁。

没有正确的解决方案

其他提示

要添加到什么奔末日说关于Java,这是ColdFusion的相当标准的做法,特别是与在那里设置您的应用程序变量的应用程序初始化程序。

不具有至少一个锁,你让初始命中Web应用程序都在同一时间初始化应用程序变量。这是假设你的应用程序是够忙的,以保证这一点。危险的是只有在那里,如果你的应用程序正忙在您的应用程序第一次启动的时间。

在第一锁确保一次仅一个请求进行初始化的变量。

在第二锁,被嵌入在第一,将检查以确保在初始化代码的端部限定一个变量存在,如application.started。如果它存在,用户被踢出。

双锁定模式已经但是救了我的皮肤上繁忙的站点,非常繁忙的站点,为应用程序的初始命中,完成请求的队列可以爬太高,太快了,导致服务器崩溃。这个想法是,请求正在等待第一次打,这是缓慢的,那么第二个闯入第一CFLOCK,并迅速拒绝。随着队列中的请求的数百或数千,成长每毫秒,他们都漏斗下降到第CFLOCK块。解决的办法是设置一个非常低的超时在第一CFLOCK和不扔(或捕捉和鸭)锁定超时错误。

最后注意到的是,我描述这种行为已被弃用与您的Application.cfc的的ColdFusion 7的onApplicationStart()方法。如果您正在使用onApplicationStart(),那么你不应该在所有的锁定您的应用程序初始化程序。的Application.cfc公已经锁定。

要总结,是的,双重检查锁定ColdFusion的作品。这是在少数特定情况下有帮助的,但这样做的权利。我不知道为什么它的工作原理,而不是Java的线程模型的原理图,它就有可能是手动检查某种查找表的ColdFusion服务器的背景。

Java是线程安全的,所以它是没有这么多,你的锁将无法正常工作,他们是没有必要的。基本上,在CF 6+,需要用于防止竞争条件或创建/ althering存在Java的控制之外的对象(文件,例如)的锁。

要打开蠕虫一个整体的其他罐...

你为什么不使用依赖注入库,如ColdSpring,跟踪你的对象,防止循环依赖。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top