单例类是否会在多线程应用程序中产生问题?

Jer*_*ith 8 ruby

这可能是过早的优化,或过早的过度警告,但我避免在几个类上使用单例,因为我担心我需要将我的应用程序作为多线程运行,并且单身人士会制造冲突和混乱.单例在Ruby中有这个问题,还是有某种内置的命名空间,这样当一个类引用单例时,只返回同一个线程上的单例?

编辑:澄清这些是可观察的类,当更新时会导致正在观看它们的其他类更新.我不确定这是否是线程安全的,但我知道现在我正在通过这些可观察的类大约一吨,这有点烦人.他们看起来像天生的单身人士课程.

duf*_*ymo 9

所有未编写为线程安全的类都会在多线程环境中导致问题,无论它们是否是单例.

你的类是单身的事实可能会使问题变得更糟,因为它默认是共享的.您不能拥有每个线程的实例.

如果单例状态是只读且不可变的,则不会出现线程安全问题.

如果修改了共享状态,则必须确保它的线程安全.

  • 在这种情况下,我不够具体.它可能是一个类,只暴露对数据的只读访问权限,但修改其内部状态. (2认同)

Kri*_*ris 9

这是一个制作singelton线程安全的例子.你必须像处理state(@things)并且不是不可变的(readonly)的任何其他对象一样对待它.getter和setter需要通过Mutex(互斥)访问内部状态.

require 'singleton'

class MyObject
  include Singleton

  def initialize
    @things = []
    @mutex  = Mutex.new
  end

  def add(thing)
    with_mutex { @things << thing }   
  end

  def things
    with_mutex { @things }
  end

  def clear
    with_mutex { @things.clear }
  end

  def self.add(thing)
    instance.add(thing)
  end

  def self.things
    instance.things
  end

  def self.clear
    instance.clear
  end

  private

  def with_mutex
    @mutex.synchronize { yield }
  end
end
Run Code Online (Sandbox Code Playgroud)

进一步阅读:http://rubylearning.com/satishtalim/ruby_threads.html