Потокобезопасность: переменные класса в Ruby
Выполнение записи / чтения переменных класса в Ruby не является потокобезопасным. Выполнение записи / чтения переменных экземпляра представляется поточно-ориентированным. Тем не менее, является ли потокобезопасным выполнение записи / чтения переменных экземпляра класса или объекта метакласса?
Каковы различия между этими тремя (надуманными) примерами с точки зрения безопасности потоков?
ПРИМЕР 1: ВЗАИМНОЕ ИСКЛЮЧЕНИЕ
class BestUser # (singleton class)
@@instance_lock = Mutex.new
# Memoize instance
def self.instance
@@instance_lock.synchronize do
@@instance ||= best
end
end
end
ПРИМЕР 2: ПЕРЕМЕННОЕ ХРАНЕНИЕ
class BestUser # (singleton class)
# Memoize instance
def self.instance
@instance ||= best
end
end
ПРИМЕР 3: ПЕРЕМЕННОЕ ХРАНЕНИЕ НА МЕТАКЛАСЕ
class BestUser # (singleton class)
# Memoize instance
class << self
def instance
@instance ||= best
end
end
end