gpt4 book ai didi

java - 与Java的LinkedList类的并发

转载 作者:行者123 更新时间:2023-12-02 07:44:51 24 4
gpt4 key购买 nike

美好的一天,

我在使用 Java 中的 LinkedList 时遇到并发问题。我有一个名为“Connection”的对象类型,它有一个名为“listeners”的“MessageHandlers”的成员变量 LinkedList。然后我有两个不同的线程,一个修改,一个迭代同一个 LinkedList。

我见过许多其他 StackOverflow 问题,建议使用同步代码块,但这似乎并没有什么帮助。我还尝试将 LinkedList 创建为并发链接列表,但我仍然收到

 Exception in thread "Thread-1" java.util.ConcurrentModificationException

异常。有人还有其他建议可以尝试吗?这是我的代码的一些片段...

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().add(this),从而得到异常。

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

有什么想法吗?非常感谢您的帮助!

最佳答案

java.util.ConcurrentModificationException 并不是真正的线程问题。这是由迭代器锁定的列表被修改引起的。我认为您正在从 MessageReceived() 调用 addNewLoggedInUser()。这会导致并发修改异常,因为调用函数已经在链表上拥有迭代器锁。

关于java - 与Java的LinkedList类的并发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11044256/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com