2011-03-04 17 views
5

में सिंगलेट का उपयोग करें मेरे पास एक अभिनेता है जो एक राज्य के सिंगलटन को कॉल का प्रतिनिधि दे रहा है। सिंगलटन राज्यपूर्ण है क्योंकि यह वस्तुओं का नक्शा बनाए रखता है। यह सिंगलटन ऑब्जेक्ट केवल अभिनेता में और एक वर्ग (अभिनेता नहीं) में उपयोग किया जाता है जहां मैं इस मानचित्र में एक ऑब्जेक्ट पुनर्प्राप्त कर रहा हूं (इसलिए केवल थ्रेड सुरक्षित पढ़ा जाता है)।अक्का स्काला अभिनेता

class MyActor extends Actor{ 
    def receive()={ 
    case ACase => singleton.amethod() 
    case BCase => singleton.bmethod() 
    } 
} 

val singleton = new MyActorLogic 

class MyActorLogic{ 
val map:Map[String, Object] = Map() 
def amethod()=//alter the map 

def readMap(value:String) = map(value) }     

क्या कोई दुष्प्रभाव/समस्या हो सकती है? धन्यवाद

उत्तर

9

नहीं है कि दुनिया में किसी भी कारण के लिए करते हैं। मेरा विश्वास करो।

आप चीजों की इस प्रकार की जरूरत है एजेंट के बजाय का उपयोग करें, कि क्या वे के लिए अच्छे हैं है:

http://doc.akka.io/docs/akka/2.0.4/scala/agents.html

+0

मैंने अभिनेता में एक नक्शा डालने और अभिनेता से पूछताछ करने का संकल्प किया है। तो सिंगलटन को अभिनेता में शामिल किया गया है और कुछ भी बेनकाब नहीं करता है। मैं सोच रहा हूं कि अभिनेता और निर्भरता इंजेक्शन अच्छे दोस्त नहीं हैं। क्या मैं सही हू? – Matroska

+2

डी ठीक काम करता है, हमारे पास वसंत-एकीकरण और एक गुइस-एकीकरण भी है। –

+1

एक संक्षिप्त स्पष्टीकरण यह एक और अधिक उपयोगी जवाब देगा। प्रश्न में दृष्टिकोण का पालन न करने के पीछे तर्क क्या है? अभिनेता में मानचित्र या एजेंटों का उपयोग करके, यह कम क्यों है? – mahonya

3

सिद्धांत रूप में, MyActorLogic, एक सरल परिवर्तनशील मानचित्र के साथ सशस्त्र का उपयोग कर, एक से अधिक थ्रेड से, (जब एक धागा नक्शा traversing है, जबकि एक और इसे संशोधित है) समवर्ती संशोधन अपवाद हो सकता है।

आप समस्याओं से बचने के लिए निम्न कर सकता है:

  1. अभिनेता में नक्शा रखो (एक निजी सदस्य के रूप में)। Akka में, आप सीधे Actor उदाहरण के साथ काम नहीं कर रहे हैं (बल्कि इसे प्रॉक्सी - ActorRef के माध्यम से एक्सेस कर रहे हैं)। इस मामले में, मानचित्र तक सुरक्षित पहुंच न केवल अभिनेता द्वारा गारंटी दी जाएगी, जो हमेशा एक संदेश को एक समय में संसाधित करती है - अन्य धागे प्रतिबिंब के माध्यम से भी निजी सदस्यों तक पहुंच नहीं पाएंगे।
  2. आप की MyActorLogic धागा सुरक्षित
  3. आप पुराने अच्छा ConcurrentHashMap
  4. इसके बजाय val map:mutable.Map का उपयोग कर सकते हैं आप var map:immutable.Map उपयोग कर सकते हैं (उदाहरण के लिए, उन्हें synchronized बनाने) अद्यतन/पुनर्प्राप्ति तरीकों बना सकते हैं। इस प्रकार, map तक पहुंचने वाले एकाधिक थ्रेड कभी-कभी एक पुराने डेटा के साथ काम कर सकते हैं, लेकिन इसमें कोई समवर्ती संशोधन नहीं होगा (कॉपी-ऑन-राइट दृष्टिकोण)।

बस टिप्पणी के लिए, सच सिंगलटन होगा:

object MyActorLogic{ 
val map:Map[String, Object] = Map() 
... 
+0

मैं पहला सुझाव का पालन करेंगे। मैं नए ऑपरेटर का उपयोग कर रहा हूं क्योंकि ऑब्जेक्ट परीक्षणों के लिए ऑब्जेक्ट मॉक करने योग्य नहीं है। लेकिन मैं केक पैटर्न का भी उपयोग कर रहा हूं, इसलिए शायद मैं केक पैटर्न के साथ वस्तुओं को नकल करने में सक्षम हूं। धन्यवाद – Matroska

+0

मैं कभी ऐसा कुछ समर्थन नहीं दूंगा। यह सिर्फ समस्याओं के लिए भीख मांग रहा है। –

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