2012-05-11 75 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社區目前的觀點或歷史討論,但否則您的答案會很好。 –

相關問題