Ruby 声明互斥和mutex.synchronize快捷方式的最佳方式是什么?

Ruby 声明互斥和mutex.synchronize快捷方式的最佳方式是什么?,ruby,singleton,mutex,Ruby,Singleton,Mutex,我在ruby代码中跨多个文件使用互斥。为了解决这个问题,我创建了一个单例类,其中包含一个我一直使用的互斥对象: class LockBlock include Singleton def initialize @lock = Mutex.new end def lock @lock end end 我有两个问题: 这是声明互斥对象的最佳方式吗?我应该使用模块而不是单例吗?我在许多文件中使用它。。 如果我这样使用它,每次我锁定一个块时,我需要写: Lock

我在ruby代码中跨多个文件使用互斥。为了解决这个问题,我创建了一个单例类,其中包含一个我一直使用的互斥对象:

class LockBlock
  include Singleton

  def initialize
    @lock = Mutex.new
  end

  def lock
    @lock
  end
end
我有两个问题:

这是声明互斥对象的最佳方式吗?我应该使用模块而不是单例吗?我在许多文件中使用它。。 如果我这样使用它,每次我锁定一个块时,我需要写: LockBlock.instance.lock.synchronize{ 代码在这里。。 }

这有捷径吗?也许可以声明lock函数,这样我就可以编写如下内容:

LockBlock.lock {
  # code here..
}
感谢

LockBlock本身就是一个对象,可以用来存储@lock实例,它是整个应用程序中的一个单例

您可以将其用于全局单例锁:

class LockBlock
  @lock = Mutex.new
  class << self
    Mutex.instance_methods(false).each do |method|
      define_method(method) do |&block|
        @lock.send(method, &block)
      end
    end
  end
end

# Now LockBlock is a Mutex like singleton object 
# and you can use it anywhere in your application (load when necessary)

LockBlock.lock
begin
  puts LockBlock.owned?
ensure
  LockBlock.unlock
end
LockBlock.synchronize { puts LockBlock.owned? }

在我看来,单例模式更多地用于类似Java的静态OO语言中,而在动态语言中则没有那么大的用处。

我想你可能对我不熟悉的模式感兴趣。酷,谢谢!谢谢我也不喜欢单身的方式,我只是不知道如何做得更好。。我对Ruby和mutex有点陌生。。我还有一个问题:在同步之前编写的代码背后的目的是什么?锁和开始块…@Guy这是使用锁的常见模式。它确保无论代码状态如何,锁都将被释放,即抛出异常?在开始之间…确保部分。同步只是一个快捷方式。