2009-06-23 10 views
7

स्काला में, अगर मैं एक साधारण वर्ग है इस प्रकार है:क्या मेरे स्कैला कलाकारों की संपत्तियों को @ वोलाटाइल चिह्नित किया जाना चाहिए?

val calc = actor { 
    var sum = 0 
    loop { 
    react { 
     case Add(n) => 
     sum += n 
     case RequestSum => 
     sender ! sum 
    } 
    } 
} 

मेरे खेत @volatile चिह्नित किया sum चाहिए? जबकि अभिनेता तार्किक रूप से एकल-थ्रेडेड (यानी संदेशों को अनुक्रमिक रूप से संसाधित किया जाता है), अलग-अलग प्रतिक्रियाएं अलग-अलग धागे पर हो सकती हैं और इसलिए state चर को एक थ्रेड पर बदला जा सकता है और फिर दूसरे से पढ़ा जा सकता है।

उत्तर

6

आपको उन्हें अस्थिर के रूप में चिह्नित करने की आवश्यकता नहीं है। आपके कोड का निष्पादन सिंक्रनाइज़ किए गए ब्लॉक के अंदर नहीं है, लेकिन आपके कोड को लागू करने से पहले अभिनेता हमेशा एक से गुजरता है, इस प्रकार थ्रेड में एक सतत स्थिति में स्मृति को मजबूर करता है।

+0

क्या यह Erlang से एक महत्वपूर्ण प्रस्थान नहीं है? इसका मतलब यह है कि कलाकारों को कोर जोड़ने के संबंध में न ही पूरी तरह से स्केलेबल होते हैं - जब तक वे पूरी तरह से स्टेटलेस नहीं होते हैं। –

+0

और अभिनेताओं के ढांचे में थ्रेड के बीच राज्य को बंद करने के लिए util.concurrent.Exchanger का उपयोग नहीं किया जा सका? –

+1

यदि किसी का वर्तमान मान केवल एक सीपीयू के रजिस्टर में है, और एक स्टेल वैल्यू साझा कैश या रैम में है, तो यह एक और सीपीयू के लिए उस स्टेल वैल्यू को देखने के लिए पूरी तरह से संभव है। @ वोलाटाइल JVM को बताता है कि जब एक स्थान पर एक मान अपडेट किया जाता है, तो उस अद्यतन को उस मान तक पहुंचने का प्रयास करने से पहले उस अद्यतन को आगे बढ़ने की आवश्यकता होती है (ठीक है, मैं यहां सरलीकृत कर रहा हूं ...)। इसी तरह, सिंक्रनाइज़ करने के लिए जेवीएम ट्रिगर करता है यह सुनिश्चित करने के लिए कि स्मृति के सभी अलग-अलग स्तर एक सतत स्थिति में हैं। मल्टीकोर से निपटने पर यह एक सार्वभौमिक समस्या है। –