Использование ссылки на переменную для указания на статический член некоторого другого класса - PullRequest
0 голосов
/ 02 августа 2011

У меня есть класс Cache, который берет List<SomeObject> someObjectList из БД и сохраняет его в статической переменной.

Теперь у меня есть другой поток A, который использует этот список следующим образом

class A extends Thread{
  private List<SomeObject> somobjLst;

  public A(){
    somobjLst = Cache.getSomeObjectList();
  }

 void run(){
  //somobjLst used  in a loop here, no additong are done it , but its value is used
 }
}
  1. Теперь, если в какой-то момент времени некоторые объекты будут добавлены в Cache.someObjectList, это отразится на классе А. Я думаю, что это должно быть как А, только содержит ссылку на него.
  2. Будет лиБудут ли какие-либо проблемы в коде А при изменении содержимого Cache.someObjectList?

РЕДАКТИРОВАТЬ: Согласно предложениям: если я сделаю

  void run (){
  while(true){
     synchronized(someObjList){


    }
     try{
     Thread.sleep(INTERVAL);
     }catch(Exception e){
     }
  }
 }


это решит проблему?

Ответы [ 2 ]

3 голосов
/ 02 августа 2011
  1. Да, изменения будут отражены и в классе A.Точно так же, как вы говорите: A содержит ссылку на тот же объект, что и Cache.

  2. Да, может привестик проблеме, если A не ожидает, что она изменится.Это также может привести к проблеме, если реализация List не является поточно-ориентированной (большинство реализаций общего назначения не являются потоко-безопасными !).Доступ к не поточно-ориентированной структуре данных из двух потоков одновременно может привести к очень неприятным проблемам.

1 голос
/ 02 августа 2011

Конечно, вы держите ссылку на коллекцию в своей теме. Если коллекция изменена во время итерации по ней в потоке, то будет выдан ConcurrentModificationException.

Чтобы избежать этого, вы должны использовать какой-то механизм синхронизации. Например, синхронизировать итерацию по коллекции и ее модификацию, выполненную в другом потоке, используя synchronize(collection).

Это своего рода "пессимистическая" блокировка.

Другая возможность - использовать коллекции из пакета java.util.concurrent.

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