2012-02-14 2 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

Любая модификация переменных на уровне класса не может быть безопасным, поскольку вы делите состояние на уровне, к которому может быть изменен любой поток.

So cattr_accessor, mattr_accessor, @@var и $var НЕ являются безопасными для резьбы.

Смежные вопросы