Good Day,Совместимость с Java LinkedList класс
У меня проблемы параллелизма с LinkedList на Java. У меня есть тип объекта, называемый «Connection», который имеет в качестве переменной-члена LinkedList «MessageHandlers», называемый «прослушиватели». Затем у меня есть два разных потока, один из которых изменяется и один итерации по одному и тому же LinkedList.
Я видел много других вопросов StackOverflow, которые предлагают использовать синхронизированный блок кода, но это, похоже, не помогает. Я также стараюсь создавать LinkedList в качестве сопутствующего связанного списка, но я все еще получаю исключение в
Exception in thread "Thread-1" java.util.ConcurrentModificationException
. Есть ли у кого-нибудь другие предложения попробовать? Вот некоторые snipbits моего кода ...
public synchronized Object ReadObject() throws java.io.IOException
{
Object obj = null;
try
{
obj = input.readObject();
synchronized(listeners)
{
Iterator<MessageHandler> i = listeners.iterator();
while(i.hasNext())
{
i.next().MessageReceived(obj, this);
}
}
}
catch (IOException e)
{
e.printStackTrace();
throw e;
}
catch (ClassNotFoundException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
return obj;
}
Вышеприведенный код находится внутри моего объекта соединения. Он вызывается из функции, которая имеет данные чтения ObjectInputStream сокета из сокета. «Input» - это экземпляр ObjectInputStream.
public void addNewLoggedInUser(User user) throws Exception
{
for(User u:loggedInUsers)
{
if(u == user)
{
throw new Exception("That user is already logged in");
}
}
//Add the new users
loggedInUsers.add(user);
synchronized(user.getConnection().getListeners())
{
user.getConnection().getListeners().add(this);
}
this.SendGameStatusUpdateToAllLoggedinPlayers();
}
Я затем вызвать метод user.getConnection(). GetListeners(). Добавить (это) и, таким образом, я получаю исключение.
public Connection()
{
//Initialize the variables to NULL
socket = null;
output = null;
input = null;
receiveThread = null;
runReceiveThread = false;
listeners = Collections.synchronizedList(new LinkedList<MessageHandler>());
//Handle the ID counter. Now we have a unique ID for every connection that comes in
connectionID = counterID;
counterID = counterID + 1;
}
Это конструктор класса соединений. Обратите внимание, что он Collections.synchronizedList
Любые идеи? Большое спасибо за Вашу помощь!
ли user.getConnection(). GetListeners() и слушатели же экземпляр в синхронном параметре блока? – George
['ConcurrentModificationException'] (http://docs.oracle.com/javase/7/docs/api/java/util/ConcurrentModificationException.html) вызывается, когда вы изменили список (добавленные/удаленные элементы) во время итерации над ним. Вы можете вызвать это исключение с помощью одного потока. Вам не нужно использовать какую-либо параллельную коллекцию, если нет нескольких потоков, которые одновременно получают доступ к списку. –
http://ideone.com/pUPCn в качестве примера. –