العديد من القراء ، كاتب واحد: هل أحتاج إلى مزامنة هذا؟

StackOverflow https://stackoverflow.com/questions/2312430

  •  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

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