我在Grails应用程序中调查看起来像竞争条件的内容。我偶尔会看到我认为只有当应用程序负载很大时,两个不同线程互相干扰的结果。
违规代码使用闭包(在类级别定义,如方法)构建查询,该闭包根据域类的属性动态添加查询参数。从表面上看,代码看起来很好(对我来说,作为一名Java开发人员),但我在Grails docs(强调我的)中偶然发现了关于控制器范围的评论:
prototype(默认) - 将为每个请求创建一个新控制器(推荐用于Closure属性的操作)
session - 为用户会话的范围创建一个控制器
singleton - 只有一个控制器实例存在(推荐用于方法的操作)
所以我的问题是:在单例服务中使用闭包(而不是方法)的含义是什么?
修改
代码是grails快速搜索插件的一部分:
我认为有两个闭包,aliasBuilder
和propertyQueryBuilder
可能不是线程安全的。
答案 0 :(得分:0)
如果你仍然需要一个解决方案,我碰巧分叉了这个插件,我偶然发现了同样的问题(在同一个并发场景中)。
长话短说,在this post的帮助下,我将@Synchronized注释应用于QuickSearchService服务的搜索方法,异常(NPE btw)消失了。
HTH