Много читателей, один писатель: мне нужно синхронизировать это? - PullRequest
4 голосов
/ 22 февраля 2010

мне нужно синхронизировать это, когда множество потоков обращаются к методу 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();
  }
}

Мне все равно, получат ли читатели старые данные, но данные должны быть согласованными.

Janning

Ответы [ 4 ]

5 голосов
/ 22 февраля 2010

Вам не нужно синхронизировать (но вы должны объявить myList как volatile), если выполняются следующие условия:

  • computeList не зависит от текущего состояния myList
  • Вы не меняете содержимое списка после того, как он был назначен (Collections.unmodifiableList(computeList()) - лучший способ выразить это условие)
1 голос
/ 22 февраля 2010

Нет, вам не нужна там синхронизация. Никаких одновременных изменений нет (если computeList() не зависит от myList).

кстати, почему вы возвращаете new ArrayList(myList) вместо простого возврата myList?

0 голосов
/ 24 февраля 2010

Я бы предпочел сделать копию неявным образом

public class ListContainer {

    private final List<String> myList = new CopyOnWriteArrayList<String>();

    public List<String> get (){
      return myList;
    }

    public List<String> set (){
       computeList();
    }
}

НТН

0 голосов
/ 22 февраля 2010

Неважно, зависит ли computeList от myList или нет, поскольку при доступе только к чтению содержимого myList не может возникнуть проблема синхронизации.

Если не использовать volatile для myList, может случиться так, что get возвращает старый myList, даже если строго установленный список уже заменил список. Если вы не возражаете против этой ситуации (это может привести к тому, что два потока увидят разные значения), то вам не нужен volatile.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...