2016-11-16 6 views
0

Предположим, у меня есть ArrayList<Foo>. Этот список очень часто изменяется. Даже значения элементов в списке будут иметь значения, которые изменяются все время. Все изменения в этом списке выполняются основным потоком.Java Deep Clone Список объектов в отдельной теме Атомно

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

Заранее спасибо. Я знаю, что решение связано с синхронизацией, но я не согласен со всеми вышеперечисленными критериями.

ответ

1

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

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

Есть недостатки и риски для обоих подходов. Если вам нужен хороший ресурс, я настоятельно рекомендую Java Concurrency in Practice.

+0

Спасибо за быстрый ответ! Хотя я искал какой-то пример, чтобы привести меня на правильный путь, а не ссылку на книгу. – olta8

+0

CopyOnWriteArrayList, похоже, работает очень хорошо. – olta8

+0

CopyOnWriteArrayList, безусловно, полезен, но не забывайте быть осторожным при изменении самих элементов (т. Е. Foos в CopyOnWriteArrayList ); он не спасет вас от проблем с перекрестными потоками ... –

Смежные вопросы