JRuby JRuby 线程安全 问题

ltl3884 · 2015年09月07日 · 最后由 robbin 回复于 2015年10月15日 · 8080 次阅读

使用 jrlint 检查代码发现

@configurations ||= Configuration.all

提示

" [nonatomic, warning] Non-local operator assignment is not guaranteed to be atomic"

像这种 lazy initialization 的代码如何修改?

应该问题不大,最多是多查询了两次 Configuration。除非 Configuration 可变。

或者可以改写成使用 Thread.current, 可以看看资料

#2 楼 @48hour

if Thread.current['Configuration'] .nil?
  Thread.current['Configuration'] = Configuration.all
end
Thread.current['Configuration']

是这样写吗?

lazy initialization 主要问题是在进行初始化操作还没完成时,第二个线程插进来可能会返回一个空指针了,然后就挂了。 wiki 里面有介绍 java 使用双重检查锁定模式解决方法,另外这里也有介绍 jruby 的 lazy initialization 问题,不过并没有提到解决方法。

这里是 ruby 大会的 jruby 分享
提到了多线程下 jruby 的处理方法

提到了 Thread Local Storage 的问题

#3 楼 @ltl3884 这样写每个线程都会有一份 Configuration。最可靠的办法是在一个地方集中进行初始化,单线程处理,之后保持对象的不变性。

@jimrokliu 我这个例子不好 应该是举一个每个线程都有一份独有数据的例子

我这个例子的代码其实在多线程下 影响不大 最坏多查几次

『每个线程都有一份独有数据』最好就每个线程创建一个自己的实例

#8 楼 @doitian 就用 Thread Local Storage 解决就行吧?看你的分享就是这么做的

#5 楼 @ltl3884 分享的文档,涨知识啊。

#9 楼 @ltl3884 是种快速的解决途径,但是变量名是全局的,注意冲突,最后带上完整的类名

@doitian 您有 QQ 或者是其他社交工具吗?希望能加你好友

初始化框架的时候 eager initialization

需要 登录 后方可回复, 如果你还没有账号请 注册新账号