Я использую Apache mina в одном из своих проектов. Функция doDecode() CumulativeProtocolDecoder вызывается каждый раз при получении порции данных. Я объединяю эти фрагменты вместе, пока не получу специальный символ в конце строки. Поэтому я начинаю конкатенацию, когда получаю $ в качестве первого символа, и заканчиваю конкатенацию, когда получаю еще один символ $.
Я хочу синхронизировать часть конкатенации, чтобы избежать любых потенциальных непреднамеренных конкатенаций.
Инкапсулируя блок конкатенации с помощью предложения synchronized(), я могу сделать эту операцию потокобезопасной, но Мой вопрос заключается в том, что пока один поток занят выполнением конкатенации, а другой поток вызывает doDecode() с новыми данными, будет ли новая информация предоставлена как аргумент doDecode() будет потерян, потому что синхронизированный блок занят, или он будет ждать и хранить аргумент в кэше, пока синхронизированный блок снова не станет доступным?
@Override
protected boolean doDecode(IoSession ioSession, IoBuffer ioBuffer, ProtocolDecoderOutput protocolDecoderOutput) throws Exception {
System.out.println("inside decoder");
try {
IoBuffer data = (IoBuffer) ioBuffer;
// create a byte array to hold the bytes
byte[] buf = new byte[data.limit()];
System.out.println("REPSONSE LENGTH: "+ data.limit());
// pull the bytes out
data.get(buf);
// look at the message as a string
String messageString = new String(buf);
synchronized (messageString) {
//do concatenatoin operatoins and other stuff
}
}
catch (Exception e) {
e.printStackTrace();
}
return true;
}