在Ruby中对类变量执行写入/读取不是线程安全的.对实例变量执行写入/读取似乎是线程安全的.也就是说,对类或元类对象的实例变量执行写/读是否是线程安全的?
在线程安全方面,这三个(人为的)示例之间有什么区别?
例1: 相互排斥
class BestUser # (singleton class)
@@instance_lock = Mutex.new
# Memoize instance
def self.instance
@@instance_lock.synchronize do
@@instance ||= best
end
end
end
Run Code Online (Sandbox Code Playgroud)
例2: 实例变量存储
class BestUser # (singleton class)
# Memoize instance
def self.instance
@instance ||= best
end
end
Run Code Online (Sandbox Code Playgroud)
例3: 在METACLASS上安装可变存储器
class BestUser # (singleton class)
# Memoize instance
class << self
def instance
@instance ||= best
end
end
end
Run Code Online (Sandbox Code Playgroud) ruby multithreading metaprogramming thread-safety ruby-1.9.2
请注意,这不是一个关于向关联添加 WHERE 条件的问题,而是一个关于在使用 eager_load 时如何更改 JOIN 子句的相当高级的问题。
假设我有这些模型
class Parent
has_many :children
have_many :grades, through: :children
end
class Child
belongs_to :parent
end
class Grade
belongs_to :child
end
Run Code Online (Sandbox Code Playgroud)
因此,为了急切地加载父母,我会这样做:
Parent.eager_load(:grades)
Run Code Online (Sandbox Code Playgroud)
但如果我想要所有的父母 - 但只是渴望加载最高分,如下所示:
LEFT OUTER JOIN grades ON grades.child_id = children.id AND grades.level = 'A+'
Run Code Online (Sandbox Code Playgroud)
我尝试过使用includes(:children).joins("LEFT OUTER JOIN grades ON grades.child_id = children.id AND grades.level = 'A+'"),但由于 Rails 不构建关联对象,因此会导致对每个父级进行额外的查询。
我还没有找到任何关于使用eager_load自定义 SQL 字符串的参考资料,并且已经深入研究了源代码,但没有得到任何更明智的结果。