Выполнение операций записи/чтения в переменных класса в 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: ЭКЗЕМПЛЯР VARIABLE STORAGE
class BestUser # (singleton class)
# Memoize instance
def self.instance
@instance ||= best
end
end
ПРИМЕР 3: ЭКЗЕМПЛЯР VARIABLE STORAGE ON METACLASS
class BestUser # (singleton class)
# Memoize instance
class << self
def instance
@instance ||= best
end
end
end