Rails 3 cattr_accessor是线程安全的吗?Rails 3 cattr_accessor是线程安全的吗?
3
A
回答
2
不,不是。刚刚得到一个快速查看cattr_reader代码:
# File activesupport/lib/active_support/core_ext/class/attribute_accessors.rb, line 28
def cattr_reader(*syms)
options = syms.extract_options!
syms.each do |sym|
class_eval( unless defined? @@#{sym} @@#{sym} = nil end def self.#{sym} @@#{sym} end, __FILE__, __LINE__ + 1)
unless options[:instance_reader] == false
class_eval( def #{sym} @@#{sym} end, __FILE__, __LINE__ + 1)
end
end
end
而且你可以运行简单的测试:
class A
cattr_accessor :b
end
t1 = Thread.new { A.b = 1; sleep 1; p (A.b == 1); }
t2 = Thread.new { A.b = 2 }
t1.join
t2.join
# outputs "false"
这里是一个办法,使工作线程安全:http://rails-bestpractices.com/posts/2010/08/23/fetch-current-user-in-models/
2
任何修改因为您正在任何线程可以修改的级别共享状态,因此类级别的变量不能安全。
因此cattr_accessor
mattr_accessor
@@var
和$var
不是线程安全的。