هل هذا الموضوع آمن؟
-
02-10-2019 - |
سؤال
أنا أكتب طلبًا لنظام 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 متزامنة ، أو الأفضل من ذلك ، مع المتغير المتغير ، مما يضمن أن قيمة المتغير هي نفسها لكل مؤشر ترابط.