如果我有类似
的课程class CustomThread < Thread
def initialize
@outside = []
super do
@inside = []
end
end
def push(value)
@outside.push(value)
@inside.push(value)
end
end
@outside
与@inside
的行为有何不同?如何确定在超级块之外分配哪些变量与其内部?
答案 0 :(得分:0)
super
从父类调用相同的方法。因此,您正在调用Thread#initialize
并传递一个分配@inside
的块。 docs告诉我们这会创建一个执行给定块的新线程。
所以不同之处在于创建@outside
时会分配CustomThread
,而在线程运行后稍后会在某个时间点分配@inside
。所以这是竞争条件:
CustomThread.new.push_value 0
因为在@inside
尝试推送push_value
时可能尚未分配thread = CustomThread.new
thread.join
thread.push_value 0
。要安全地使用它,你必须这样做
{{1}}