0

我在我的 CF 应用程序中使用了双重检查锁定版本(在我知道双重检查锁定是什么之前)。

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

这似乎可行,因为没有过多的锁定并且不会创建对象重复项。但是,我最近了解到Double Checked Locking 在 Java 中不起作用,我不知道这在 CF 中是否成立,因为 CF 线程和锁与本机 Java 线程和锁并不完全相同。

4

3 回答 3

6

补充一下 Ben Doom 关于 Java 的说法,这是 ColdFusion 中相当标准的做法,特别是在设置应用程序变量的应用程序初始化例程中。

在没有至少一个锁的情况下,您会让对您的 Web 应用程序的初始点击都同时初始化应用程序变量。这假设您的应用程序足够忙以保证这一点。仅当您的应用程序在您的应用程序首次启动时很忙时,才会存在危险。

第一个锁确保一次只有一个请求初始化您的变量。

第二个锁,嵌入在第一个中,将检查以确保在初始化代码末尾定义的变量存在,例如 application.started。如果存在,则将用户踢出。

双锁定模式在繁忙的站点上拯救了我的皮肤,但是,对于非常繁忙的站点,完成应用程序初始命中的请求队列可能会爬得太高、太快,并导致服务器崩溃。这个想法是,请求正在等待第一个命中,这很慢,然后第二个闯入第一个 cflock,并很快被拒绝。队列中有成百上千的请求,每毫秒都在增长,它们都汇集到第一个 cflock 块。解决方案是在第一个 cflock 上设置一个非常低的超时,而不是抛出(或捕获和躲避)锁定超时错误。

最后一点,我描述的这种行为已被您的 Application.cfc 的 ColdFusion 7 的 onApplicationStart() 方法弃用。如果您正在使用 onApplicationStart(),那么您根本不应该为您的应用程序初始化例程锁定。Application.cfc 已经很好地锁定了。

总而言之,是的,双重检查锁定在 ColdFusion 中有效。在某些特定情况下它会有所帮助,但要正确操作。我不知道它为什么与 Java 的线程模型相反的原理图,很可能它是在您的 ColdFusion 服务器的后台手动检查某种查找表。

于 2009-02-16T22:16:50.563 回答
2

Java 是线程安全的,所以并不是说你的锁不起作用,而是它们不是必需的。基本上,在 CF 6+ 中,需要锁来防止竞争条件或创建/更改存在于 Java 控制之外的对象(例如文件)。

于 2009-02-16T14:10:44.397 回答
0

打开另一罐蠕虫...

为什么不使用依赖注入库(例如 ColdSpring)来跟踪您的对象并防止循环依赖。

于 2009-02-18T14:36:21.557 回答