2016-01-24 2 views
1

Я работаю с потоками как неоперившийся. Поэтому мне нужна помощь.Поддержание одного синхронизированного списка массивов между несколькими потоками в java

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

Например, класс main() дал двум потокам массив-список. Затем первая нить добавила значение в слот 1 массива, второй поток, когда добавление увидит изменение, и когда оно будет добавлено, оно добавит во вторую позицию. Когда main предоставит список массивов в новый поток, все эти изменения, сделанные ранее, будут легко включены, и он начнет добавлять с третьей или более поздней позиции. Другое дело, только один поток может внести изменения за раз или он должен быть синхронизирован.

Как я могу это сделать в java? Может кто-нибудь мне помочь?

+0

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

+0

Обратите внимание, что вам нужно убедиться, что один поток может выполняться одним потоком без «прерывания» потоков: 1. Найдите следующий свободный индекс. 2. Задайте значение по этому индексу. Синхронизация - один из способов достижения этого. –

+0

Я инкапсулировал список в класс и передал его вызывающим потокам. Оно работает. Для синхронизации я использовал класс singelton с синхронным доступом к методам. Thanx @JBNizet – Mahin

ответ

1

Рамки коллекции предлагает удобные оберток для синхронизации:

 List<TypeOfItem> list = Collections.synchronizedList(new ArrayList<>()); 

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

+0

Это не помогает в сценарии, когда поток должен найти минимальный неназначенный индекс и заполнить его атомарно. –

+0

Почему вы хотите это сделать? ArrayList поддерживает эти вещи для вас. Просто используйте add(), и элемент добавляется в список. – Heri

+0

Потому что thread2, возможно, решил, что [1] свободен и собирается записать значение 2. В то же время thread3 также определит, что [1] свободен и собирается записать значение 3. Вы попадаете в расу условие, когда один и тот же код иногда создает [1] = 2, а иногда и [1] = 3 –

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