Groovy / Grails,螺纹安全和闭合

时间:2015-10-25 08:33:10

标签: grails groovy thread-safety closures

我在Grails应用程序中调查看起来像竞争条件的内容。我偶尔会看到我认为只有当应用程序负载很大时,两个不同线程互相干扰的结果。

违规代码使用闭包(在类级别定义,如方法)构建查询,该闭包根据域类的属性动态添加查询参数。从表面上看,代码看起来很好(对我来说,作为一名Java开发人员),但我在Grails docs(强调我的)中偶然发现了关于控制器范围的评论:

  

prototype(默认) - 将为每个请求创建一个新控制器(推荐用于Closure属性的操作)

     

session - 为用户会话的范围创建一个控制器

     

singleton - 只有一个控制器实例存在(推荐用于方法的操作)

Reference

所以我的问题是:在单例服务中使用闭包(而不是方法)的含义是什么?

修改

代码是grails快速搜索插件的一部分:

https://github.com/tadodotcom/grails-quick-search/blob/master/grails-app/services/org/grails/plugins/quickSearch/QuickSearchService.groovy

我认为有两个闭包,aliasBuilderpropertyQueryBuilder可能不是线程安全的。

1 个答案:

答案 0 :(得分:0)

如果你仍然需要一个解决方案,我碰巧分叉了这个插件,我偶然发现了同样的问题(在同一个并发场景中)。

长话短说,在this post的帮助下,我将@Synchronized注释应用于QuickSearchService服务的搜索方法,异常(NPE btw)消失了。

HTH