2012-01-21 5 views
0
public void consumeResponse(OmwListResponse<T> response) { 
    synchronized (response.getResultList()) { // XXX this isn't synchronized safely 
     for (T t : response.getResultList()) { 
      if (!cacheList.contains(t)) { 
       cacheList.add(t); 
      } 
     } 
    } 
} 

ситуация, я не хочу, чтобы кто случайно response.getResultList() или cacheList пока этот метод не будет сделано. Как правильно это сделать?Как это правильно синхронизировать?

+0

Если 'getResultList()' возвращает новый список для каждого вызова, блок 'synchronized' не будет делать ничего полезного. –

+0

Просто ссылка getter. – user123321

ответ

0

Создание блокировки объекта:

private static final void LOCK = new Object(); 

и синхронизации по этому вопросу.

+0

да, но может ли что-то извне изменить этот метод response.getResultList() еще? Или LOCK даже блокирует все вещи внутри синхронизированного блока, пока это не будет сделано? – user123321

+0

@musselwhizzle - синхронизированный блок будет защищать только от одновременного доступа посредством кода взаимодействия (то есть кода, который также синхронизируется с одним и тем же объектом блокировки). Если необходимо, вы можете сделать свой 'LOCK' объект' public' и дать ему более значимое имя (например, 'OMW_RESPONSE_LOCK'). Затем синхронизируйте объект блокировки со всем кодом, который модифицирует «ответ» или «cacheList». Я рекомендую против вложенных синхронизированных блоков, потому что это основной источник взаимоблокировок. –

+0

э ... я не уверен, что я действительно хочу пойти по этой дороге. Я бы хотел, чтобы моя синхронизация была скрыта от реализации. На этом этапе я скорее сделаю копию getResultList, а затем запустил цикл. Да, я пытаюсь избежать вложенных синхронизированных блоков. – user123321

0

Синхронизация кеша легко. Просто обернуть любой код, код, который использует его в:

synchronized(cacheList) { 
    // Make changes to cacheList here 
} 

Если cacheList является публичным членом, и вы боитесь, внешние классы изменить его, сделать его закрытый член и синхронизировать геттер и сеттер. Это единственный способ, поскольку вы не можете контролировать то, что делают другие классы, и вы несете ответственность за синхронизацию своих членов.

Что касается ответа, это сложнее, потому что я не знаю, что такое OmwListResponse. Вы владеете этим классом? Если это так, используйте тот же метод, что и выше. Если нет, вам может быть не повезло.