Java StreamCorruptedException |多线程环境中objectInputStream.readObject()中的OptionalDataException

Java StreamCorruptedException |多线程环境中objectInputStream.readObject()中的OptionalDataException,java,multithreading,sockets,objectinputstream,objectoutputstream,Java,Multithreading,Sockets,Objectinputstream,Objectoutputstream,我有一个客户机-服务器体系结构。服务器可以有*个客户端,因此为每个客户端创建两个线程输入和输出 我有一个主类来协调服务器端的所有操作。除其他外,它有这样一种方法: public static synchronized void sendMessageToUser(Message message, String username){ clientOutputThreadPool.submit(new ObjectStreamOutputCallable(userObjectOutputSt

我有一个客户机-服务器体系结构。服务器可以有*个客户端,因此为每个客户端创建两个线程输入和输出

我有一个主类来协调服务器端的所有操作。除其他外,它有这样一种方法:

public static synchronized void sendMessageToUser(Message message, String username){
    clientOutputThreadPool.submit(new ObjectStreamOutputCallable(userObjectOutputStreams.get(username), message));
}
objectOutputStreamCallable获取传递给特定用户的objectOutputStream,我将它们保存在hashmap中以重用它们。可调用的线程在线程池中执行

可调用项如下所示:

@Override
public Object call() throws Exception {
    writeObjectToStream();
    return null;
}

private synchronized void writeObjectToStream() throws IOException {
    oos.reset();
    oos.writeObject(message);
    oos.flush();
}

现在我!有时在客户端获取上述错误。事实上,这种情况只有30-40%的时间发生,这让我相信,它与并发性有关。例如,是否可能是正在序列化的消息对象同时在代码中的其他地方被操作,然后导致错误?我读过很多次,一个人不能使用多个objectOutputStream或objectInputStream。但我在代码中找不到任何地方可以为同一客户机使用不同的objectOutputStreams。每一个都有一个oos,它们在套接字创建时创建,然后保存在hashmap中供以后使用。此外,我在每条消息之前重置套接字,但仍然没有效果…

显示客户端代码和异常的堆栈跟踪。在oos上同步以防止同时写入2条消息。writeObjectToStream上的同步可能没有效果,因为会为要写入的每条消息创建一个新实例。