Как повторно использовать список в Java?

У меня есть многопоточный класс с очередью list<string>, когда я выдвигаю список из main в очереди многопоточных классов в списке Java, передается по ссылке. поэтому, когда в следующий раз я снова воспользуюсь этим списком со списком очистки, мой список очереди на стороне потока также очистится

list<int> my-list=new array list<int>();
obj.push(my-list); //obj is thread class obj.

в следующий раз, как использовать my-list, чтобы сторона потока не влияла на список.

если я снова использую my-list.clear(); а также obj.push(my-list); очистить данные со стороны потока я должен каждый раз создавать новый список?

1 ответ

я должен каждый раз создавать новый список?

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

Когда вы помещаете объект Java в Queue (или действительно, и другая структура данных структуры коллекции) это не копирует это. Ваш код должен учитывать это.


На самом деле, это еще хуже. Поскольку вы говорите о многопоточном приложении, могут быть проблемы с вызовом (скажем) clear в очереди, даже если вы намеревались изменить список в очереди.

Проблема в том, что, если операции в списке не синхронизированы должным образом, другой поток, который читает список, не обязательно увидит непротиворечивую версию списка. Возможно, он вообще не увидит обновления, но, что еще хуже, может увидеть несовместимое представление списка; например, "размер", который он видит, может не совпадать с фактическим количеством элементов в списке. (И это даже при том, что читатель и писатель не делают вещи одновременно...)


  for(0---5){
    list<int> my-list=new array list<int>(); 
    obj.push(my-list); //obj is thread class obj. 
  } 

что произойдет, когда мой код из цикла for 5 уничтожит весь список потоков.

Что происходит, так это то, что 5 созданных вами объектов списка останутся в очереди. Они не уничтожены.

В Java объекты (никогда) не "уничтожаются", когда переменные, на которые они ссылаются, выходят из области видимости. Самое большее, они могут получить право на сборку мусора... если на них не осталось доступных ссылок. Но в вашем примере будут ссылки в obj очередь... потому что вы только что добавили их... и obj сама очередь достижима, потому что obj это static поле (вы сказали).

По сути, если ваша программа все еще может найти ссылку на объект, она не будет уничтожена.

или каждый раз создание списка имен одинаково?

Я не уверен, что вы спрашиваете здесь...

Другие вопросы по тегам