العديد من القراء ، كاتب واحد: هل أحتاج إلى مزامنة هذا؟
-
22-09-2019 - |
سؤال
هل أحتاج إلى مزامنة هذا ، عندما تصل العديد من مؤشرات الترابط إلى طريقة GET ، ويصل مؤشر ترابط واحد فقط إلى طريقة Setlist؟
public class ListContainer {
private List<String> myList = new ArrayList<String();
public List<String> get ( )
{
return new ArrayList<String>(myList);
}
public List<String> set ( )
{
this.myList = computeList();
}
}
لا يهمني إذا حصل القراء على بيانات قديمة ، ولكن يجب أن تكون البيانات متسقة.
يانينج
المحلول
ليس عليك المزامنة (ولكن يجب أن تعلن myList
مثل volatile
) إذا كانت الشروط التالية صحيحة:
computeList
لا يعتمد على الوضع الحالي لـmyList
- لا تقوم بتغيير محتوى القائمة بعد تعيينها (
Collections.unmodifiableList(computeList())
هي أفضل طريقة للتعبير عن هذا الشرط)
نصائح أخرى
لا ، لا تحتاج إلى التزامن. لا توجد أي تعديلات متزامنة (إذا computeList()
لا يعتمد على myList
).
راجع للشغل ، لماذا تعود new ArrayList(myList)
بدلا من مجرد العودة myList
?
لا يهم ما إذا كان Computelist يعتمد على MyList أم لا ، طالما أنه لا يوجد سوى وصول القراءة إلى محتوى MyList لا يمكن أن تنشأ أي مشكلة المزامنة.
إذا لم تكن تستخدم متطايرة لـ MyList ، فقد يحدث الحصول على إرجاع MyList القديم ، على الرغم من أن Setly Set قد استبدل القائمة بالفعل. إذا كنت لا تمانع في هذا الموقف (يمكن أن يؤدي إلى ترابطين لرؤية قيم مختلفة) ، فأنت لا تحتاج إلى متقلبة.
أفضل القيام بالنسخة الضمنية بواسطة
public class ListContainer {
private final List<String> myList = new CopyOnWriteArrayList<String>();
public List<String> get (){
return myList;
}
public List<String> set (){
computeList();
}
}
HTH