简体   繁体   English

Rails 3 cattr_accessor线程安全吗?

[英]Is Rails 3 cattr_accessor thread-safe?

Rails 3 cattr_accessor线程安全吗?

No, it's not. 不,这不对。 Just get a quick look at the cattr_reader code: 快速查看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

And you could run simple test: 你可以运行简单的测试:

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"

Here is a way to make it work thread-safely: http://rails-bestpractices.com/posts/2010/08/23/fetch-current-user-in-models/ 以下是一种使其安全线程安全的方法: http//rails-bestpractices.com/posts/2010/08/23/fetch-current-user-in-models/

Any modification of variables at a class level cannot be safe since you are sharing state at a level to which any thread can modify. 由于您在任何线程可以修改的级别共享状态,因此在类级别对变量进行任何修改都是不安全的。

So cattr_accessor , mattr_accessor , @@var and $var are NOT thread safe. 所以cattr_accessormattr_accessor@@var$var都不是线程安全的。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM