2012-12-30 12 views
11

संभव डुप्लिकेट:
Does ruby have the Java equivalent of synchronize keyword?रूबी में संगामिति के लिए सिंक्रनाइज़ विधि

जावा में हम एक विधि सिर्फ समारोह परिभाषा 'सिंक्रनाइज़' कीवर्ड का उपयोग करके 'सिंक्रनाइज़' कर सकते हैं।

हम रूबी में यह कैसे करते हैं?

+0

क्षमा करें मेरा प्रश्न उपरोक्त टिप्पणी में दिए गए लिंक के समान है। कृपया –

+0

को बंद करने के लिए स्वतंत्र महसूस करें, मैं बंद करने के लिए वोट नहीं दूंगा। जवाब इस पर बेहतर है। –

उत्तर

14

संभव नहीं है। बस विधि कॉल को mutex पर लपेटें।

वर्ग के अंदर नई Mutex बनाएं, ताकि आप एक ही म्युटेक्स उपयोग कर सकते हैं:

class Foo 
    attr_reader :my_val 

    def initialize 
    @my_mutex = Mutex.new 
    @my_val = 0 
    end 

    def bar 
    @my_mutex.synchronize do 
     # do something you want to be synchronized here, e.g.: 
     @my_val = @my_val + 1 
    end 
    end 

    def another_bar 
    @my_mutex.synchronize do 
     # do something you want to be synchronized here 
     @my_val = @my_val - 1 
    end 
    end 
end 

foo = Foo.new 
threads = [] 
threads << Thread.new { 50.times { foo.bar }} 
threads << Thread.new { 50.times { foo.another_bar }} 
threads.map { |t| t.join } # wait for all threads to finish 
puts foo.my_val # should print 0 

देखें http://apidock.com/ruby/Mutex

तुम भी हो सकता है सिर्फ अपने तरीकों की रक्षा के लिए कुछ metaprogramming जादू कर सकता है .. रैपिंग तरीकों तुम्हारे लिए, उदाहरण के लिए नए संशोधित "बार" और "another_bar" विधि को इसके अंदर ब्लॉक सिंक्रनाइज़ करने के साथ।

+0

इस बारे में क्या है http://stackoverflow.com/questions/3208462/does-ruby-have-the-java-equivalent-of-synchronize-keyword? –

+11

पहला कोड नमूना अच्छा है, लेकिन 'Mutex.new.synchronize' बेकार है। चूंकि आप नव निर्मित म्यूटेक्स का संदर्भ नहीं रखते हैं, कोई अन्य धागा कभी भी इसे लॉक करने का प्रयास नहीं कर सकता है, इसलिए यह कभी भी महत्वपूर्ण क्षेत्र से किसी भी धागे को बाहर नहीं करेगा (जो म्यूटेक्स का पूरा बिंदु है)। –

+0

मुझे यकीन नहीं है कि यह सच है लेकिन क्या @ एलेक्सडी ने कहा कि कुल समझ में आता है! –

संबंधित मुद्दे