2011-09-18 7 views
9

में सिंक्रनाइज़ काउंटर यदि मैं वैश्विक काउंटर रखना चाहता हूं (उदाहरण के लिए कई धागे में आने वाले अनुरोधों की संख्या गिनने के लिए), तो जावा में करने का सबसे अच्छा तरीका अस्थिर int का उपयोग करना होगा। मान लीजिए, क्लोजर का उपयोग किया जा रहा है क्या एक बेहतर (बेहतर थ्रूपुट) तरीका है?क्लोजर

उत्तर

13

मैं Clojure में एक atom के साथ ऐसा होगा:

(def counter (atom 0N)) 

;; increment the counter 
(swap! counter inc) 

;; read the counter 
@counter 
=> 1 

यह पूरी तरह धागे की सुरक्षित, और आश्चर्यजनक रूप से उच्च प्रदर्शन है। इसके अलावा, के बाद से यह Clojure के abitrary परिशुद्धता संख्यात्मक हैंडलिंग का उपयोग करता है, यह नहीं है कि जिस तरह से एक अस्थिर पूर्णांक हो सकता है में पूर्णांक अतिप्रवाह के लिए असुरक्षित है .....

+0

यह तो एक अस्थिर पूर्णांक का उपयोग कर बेहतर प्रवाह क्षमता प्रदान करेगा? यदि हां, तो कोई अंतर्दृष्टि क्यों/बेहतर क्यों है। – 142857

+1

एक परमाणु एक अस्थिर int की तुलना में थोड़ा धीमा होगा। लेकिन जब तक आप प्रति सेकंड लाखों घटनाओं की गणना नहीं कर रहे हैं, तो अंतर ध्यान देने के लिए पर्याप्त नहीं होगा। और थ्रूपुट के उस स्तर पर, एक अस्थिर int एक घंटे से भी कम समय में बहती है ...... – mikera

+3

क्लोजर 1.3 पर, यह ओवरफ़्लो हो सकता है: '(स्वैप! (परमाणु 9 223372036854775807) inc)' ओवरफ्लो अपवाद फेंकता है। फिक्स बिगइंट्स का उपयोग करना है: '(स्वैप! (परमाणु 9 223372036854775807 एन) इंक) या ऑटो-प्रमोशनिंग' inc'' फ़ंक्शन –

7

के रूप में एक agent

(def counter (agent 0)) 
एक वैश्विक काउंटर को परिभाषित करें

एजेंट में निहित मूल्य में वृद्धि करने के लिए आप send एक समारोह एजेंट को (इस मामले inc में):

(send counter inc) 

वर्तमान मूल्य को पढ़ने के लिए आप उपयोग कर सकते deref या @ रीडर मैक्रो:

@counter ;; same as (deref counter) 

एजेंट कई उपलब्ध संदर्भ प्रकारों में से केवल एक हैं। आप Clojure वेबसाइट पर इन चीजों के बारे में और अधिक पढ़ सकते हैं: