سؤال

أنا أكتب طلبًا لنظام Android وأستخدم مؤشرات ترابط العمال لمعالجة معلومات معينة. بعد قراءة الكود الخاص بي ، لست متأكدًا الآن إذا كان مؤشر ترابط آمن.

لقد كتبت نسخة مبسطة من الكود الخاص بي ، لقد حذفت Handler الكائن المستخدم للتواصل مع الخيط الرئيسي ومن الواضح أن العملية نفسها.

public class myClass implements Runnable
{
    private String myString;

    @Override
    public void run()
    {
        myString = "Some Value";
    }
}

وهذا ما يسمى بتشغيل شيء مشابه لهذا.

myClass class = new myClass();
Thread thread = new Thread(class);
thread.start()

لذا ، هل هذا الرمز ليس مؤشرًا آمنًا لأنني أعدل myString (أعلن في الخيط الرئيسي) في run() وظيفة؟

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

المحلول

في حد ذاته ، هذا آمن الخيط. لكن الخيوط ستكون قراءة ال myString القيمة؟ إذا قرأته من الخيط الرئيسي بعد كتابته في الخيط الجديد ، فإن ذلك ليس آمن الخيط.

نصائح أخرى

لا ، كما قدمته ، فهو آمن. إذا قمت بعمل getter لمتغير MyString ، فلديك مشكلة في ترابط محتملة. في هذه الحالة ، ترغب في جعل طريقة getter/setter متزامنة ، أو الأفضل من ذلك ، مع المتغير المتغير ، مما يضمن أن قيمة المتغير هي نفسها لكل مؤشر ترابط.

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