2013-01-05 29 views
9

मैं स्कैला में एक कम्प्यूटेशनल लाइब्रेरी लिख रहा हूं। इसी तरह की कार्यक्षमता मैं देशी स्कैला सिंगलटन ऑब्जेक्ट्स में समूह करता हूं जिसमें प्रक्रियाओं का समूह होता है और ओ (1) अस्थायी डेटा के लिए कुछ स्थिर आवंटित स्मृति होती है।स्केल पर थ्रेड-स्थानीय ऑब्जेक्ट्स बनाना

यह दृष्टिकोण एकल-थ्रेड उपयोग के लिए उपयुक्त है। लेकिन एक साथ विभिन्न धागे से पुस्तकालय कार्यों को कॉल करना अस्थायी डेटा को ओवरराइट कर सकता है और कॉलर्स को गलत जवाब दे सकता है।

मैं सिर्फ इस पुस्तकालय की प्रतिलिपि बना सकता हूं और सभी स्थानीय आवंटित स्मृति स्थानीय कार्यों के अंदर थ्रेड-सुरक्षित संस्करण लिख सकता हूं। लेकिन मैं धागे-स्थानीय चर को परिभाषित करके इसे टालना पसंद करता हूं।

क्या यह स्कैला में संभव है?

उत्तर

22

चर को स्टोर करने के लिए बस जावा की java.lang.ThreadLocal कक्षा का उपयोग करें।

val tl = new ThreadLocal[String] 
tl.set("fish") 
tl.get // "fish" 

अवगत ऐसा करने के लिए एक अशून्य प्रदर्शन दंड है कि वहाँ रहो (~ मेरे हाथ में 6 एनएस, के रूप में मुझे याद है)। यदि आप वास्तव में हल्के सामान (उदाहरण के लिए एक सूचकांक में वृद्धि) कर रहे हैं, तो आप गति में अंतर देख सकते हैं।

+4

यह भी ध्यान दें कि स्कैला की 'गतिशील वैरिएबल' है जो मूल रूप से 'इनहेरिएबल थ्रेडलोकल' के चारों ओर एक रैपर है। यह गैर विरासत योग्य थ्रेड स्थानीय लोगों के लिए कोई विकल्प प्रदान नहीं करता है। –

+0

@ रेगिस जीन-गिल्स शायद यह ओपी के सवाल से सख्ती से संबंधित नहीं है, लेकिन: आपने 'इनहेरिएबल थ्रेडलोकल' का उल्लेख किया है, ऐसा लगता है कि यह पूलिंग के कारण 'एक्जिक्यूटर्स' ढांचे के साथ अच्छी तरह से जुड़ा हुआ नहीं है। क्या इस तरह के चर के लिए एक उपयोग केस है, सामान के अलावा 'नया थ्रेड()। प्रारंभ() 'में रखा गया है? – idonnie

+0

'गतिशील वैरिएबल '* गतिशील स्कोप पैटर्न * को लागू करने के लिए उपयोगी है। उदाहरण के द्वारा मेरा दूसरा उत्तर देखें: http://stackoverflow.com/a/13252952/1632462। हालांकि इसे कभी भी बहु-थ्रेडेड संदर्भ में उपयोग नहीं किया जाना चाहिए, जहां यह काम नहीं करेगा। –

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

  • कोई संबंधित समस्या नहीं^_^