Ruby 声明互斥和mutex.synchronize快捷方式的最佳方式是什么?
我在ruby代码中跨多个文件使用互斥。为了解决这个问题,我创建了一个单例类,其中包含一个我一直使用的互斥对象: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
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这是使用锁的常见模式。它确保无论代码状态如何,锁都将被释放,即抛出异常?在开始之间…确保部分。同步只是一个快捷方式。