Безопасность потоков: переменные класса в 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: ЭКЗЕМПЛЯР 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
39
задан Joseph Jaber 4 March 2012 в 19:41
поделиться