2012-05-11 44 views
1

如果你想锁定实例的方法,你必须创建为每个实例和方法的Mutex是否有一个合乎逻辑的原因,Thread.exclusive不采用“范围”参数?

class Foo 
    def initialize 
    @blue_mutex = Mutex.new 
    @red_mutex = Mutex.new 
    end 

    def blue 
    @blue || @blue_mutex.synchronize do 
     @blue ||= Blue.new 
    end 
    end 

    def red_mutex 
    @red || @red_mutex.synchronize do 
     @red ||= Red.new 
    end 
    end 
end 

有具有Thread.exclusive带参数的一个逻辑上的错误?

class Foo 
    def blue 
    @blue || Thread.exclusive("#{object_id}/blue") do 
     @blue ||= Blue.new 
    end 
    end 

    def red 
    @red || Thread.exclusive("#{object_id}/red") do 
     @red ||= Red.new 
    end 
    end 
end 

为什么要创建互斥量,如果Thread.exclusive可能只是把它定义了排他性的范围的争论?

回答

0

简而言之,API可以按照您描述的方式完成。事实上,这是Java通过让你锁定一个任意对象。它必须玩技巧,因为跟踪锁定会占用对象本身的一些保留空间。另外,当对象被锁定并且变得竞争时,必须创建一个真正的互斥体,它使用更多的空间。但希望你的代码不会被对象锁定和解锁。我的猜测是,Ruby创作者不希望为每个对象提供这种只会很少使用的额外功能。

我在上面说过,当你说“笨重”时,你指的是代码的可读性。如果你关注性能,我怀疑是否有太大的区别。在涵盖范围内,任何一种方法都可以使用相同的非常有效的技术这只是将额外内存存储在每个对象上的问题。我发现了一些有趣的细节here

+0

约翰,谢谢。我将再等几天,看看我能否得到一个答案,指出Ruby社区目前的观点或历史讨论,但否则您的答案会很好。 –

相关问题