स्काला में, अगर मैं एक साधारण वर्ग है इस प्रकार है:क्या मेरे स्कैला कलाकारों की संपत्तियों को @ वोलाटाइल चिह्नित किया जाना चाहिए?
val calc = actor {
var sum = 0
loop {
react {
case Add(n) =>
sum += n
case RequestSum =>
sender ! sum
}
}
}
मेरे खेत @volatile
चिह्नित किया sum
चाहिए? जबकि अभिनेता तार्किक रूप से एकल-थ्रेडेड (यानी संदेशों को अनुक्रमिक रूप से संसाधित किया जाता है), अलग-अलग प्रतिक्रियाएं अलग-अलग धागे पर हो सकती हैं और इसलिए state
चर को एक थ्रेड पर बदला जा सकता है और फिर दूसरे से पढ़ा जा सकता है।
क्या यह Erlang से एक महत्वपूर्ण प्रस्थान नहीं है? इसका मतलब यह है कि कलाकारों को कोर जोड़ने के संबंध में न ही पूरी तरह से स्केलेबल होते हैं - जब तक वे पूरी तरह से स्टेटलेस नहीं होते हैं। –
और अभिनेताओं के ढांचे में थ्रेड के बीच राज्य को बंद करने के लिए util.concurrent.Exchanger का उपयोग नहीं किया जा सका? –
यदि किसी का वर्तमान मान केवल एक सीपीयू के रजिस्टर में है, और एक स्टेल वैल्यू साझा कैश या रैम में है, तो यह एक और सीपीयू के लिए उस स्टेल वैल्यू को देखने के लिए पूरी तरह से संभव है। @ वोलाटाइल JVM को बताता है कि जब एक स्थान पर एक मान अपडेट किया जाता है, तो उस अद्यतन को उस मान तक पहुंचने का प्रयास करने से पहले उस अद्यतन को आगे बढ़ने की आवश्यकता होती है (ठीक है, मैं यहां सरलीकृत कर रहा हूं ...)। इसी तरह, सिंक्रनाइज़ करने के लिए जेवीएम ट्रिगर करता है यह सुनिश्चित करने के लिए कि स्मृति के सभी अलग-अलग स्तर एक सतत स्थिति में हैं। मल्टीकोर से निपटने पर यह एक सार्वभौमिक समस्या है। –