Выполнение записи/чтения переменных класса в 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: ИНСТАНЦИЯ ПЕРЕМЕННОГО ХРАНЕНИЯ НА METACLASS
class BestUser # (singleton class)
# Memoize instance
class << self
def instance
@instance ||= best
end
end
end