سؤال

في Scala ، إذا كان لدي فصل بسيط على النحو التالي:

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

يجب أن يكون مجال بلدي sum يكون علامة @volatile؟ بينما الممثل هو منطقيا واحد-ترقي (أي تتم معالجة الرسائل بالتتابع) ، قد تحدث ردود الفعل الفردية على مؤشرات ترابط منفصلة وبالتالي state قد يتم تغيير المتغير على موضوع واحد ثم قراءة من آخر.

هل كانت مفيدة؟

المحلول

لا تحتاج إلى وضع علامة عليها على أنها متقلبة. إن تنفيذ الكود الخاص بك ليس داخل كتلة متزامنة ، لكن الممثل سيمر دائمًا من خلال واحد قبل استدعاء الكود الخاص بك ، وبالتالي فرض الذاكرة على حالة متسقة عبر مؤشرات الترابط.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top