Я просмотрел так много руководств по синхронизации, что у меня голова идет кругом. Я никогда не понимал этого :(.
У меня есть сервер Java (MainServer), который при подключении клиента создает новый поток (ServerThread) с DataOutputStream.
Клиент общается с ServerThread, и ServerThread отвечает. Время от времени MainServer будет рассылать сообщение всем клиентам, используя каждый объект DataOutputStream ServerThread.
Я совершенно уверен, что время от времени моя проблема связана с тем, что и MainServer, и ServerThread пытаются что-то отправить клиенту одновременно. Поэтому мне нужно заблокировать объект DataOutputStream. Для моей жизни я не могу понять эту концепцию дальше. Каждый пример, который я читал, сбивает с толку.
Каков правильный способ справиться с этим?
Метод отправки клиенту ServerThread:
public void replyToOne(String reply){
try {
commandOut.writeUTF(reply);
commandOut.flush();
} catch (IOException e) {
logger.fatal("replyToOne", e);
}
logger.info(reply);
}
Метод распространения MainServer всем клиентам:
public static void distribute(String broadcastMessage){
for (Map.Entry<String, Object[]> entry : AccountInfoList.entrySet()) {
Object[] tmpObjArray = entry.getValue();
DataOutputStream temporaryCOut = (DataOutputStream) tmpObjArray[INT_COMMAND_OUT]; //can be grabbed while thread is using it
try {
temporaryCOut.writeUTF(broadcastMessage);
temporaryCOut.flush();
} catch (IOException e) {
logger.error("distribute: writeUTF", e);
}
logger.info(broadcastMessage);
}
}
Я думаю, у меня должно быть что-то подобное в моем классе ServerThread.
public synchronized DataOutputStream getCommandOut(){
return commandOut;
}
Это действительно так просто? Я знаю, что об этом, вероятно, спрашивали и отвечали, но, похоже, я все еще не понимаю этого без индивидуальной помощи.