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

时间:2014-08-21 14:22:26

标签: ruby singleton mutex

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

class LockBlock
  include Singleton

  def initialize
    @lock = Mutex.new
  end

  def lock
    @lock
  end
end

我有两个问题:

  1. 这是声明我的互斥对象的最佳方式吗?我应该使用模块而不是Singleton吗?我在很多文件中使用它..
  2. 如果我这样使用它,每次锁定一个块时,我都要写:
  3. LockBlock.instance.lock.synchronize { # code here.. }

    这有什么捷径吗?也许要声明锁定功能所以我可以这样写:

    LockBlock.lock {
      # code here..
    }
    

    由于

1 个答案:

答案 0 :(得分:0)

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? }

IMO单例模式在Java中更像是静态OO语言,在动态语言中没有用。