2012-02-14 112 views

回答

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_accessormattr_accessor@@var$var不是线程安全的。