У меня есть этот метод для записи сообщений в сокет:
public void sendMessage(byte[] msgB) {
try {
synchronized (writeLock) {
log.debug("Sending message (" + msgB.length + "): " + HexBytes.toHex(msgB));
ous.write(HEADER_MSG);
ous.writeInt(msgB.length);
ous.write(msgB);
ous.flush();
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
Теперь поток с именем Боб хотел бы закрыть сокет в какой-то неопределенный момент X , что означает, что все еще могут быть потоки, ожидающие writeLock
, чтобы отправить свое сообщение, и даже может быть один поток в середине его написания.
Я могу решить последнее, разрешив Боб получает writeLock
перед закрытием сокета, но я все еще могу потерять сообщения, которые еще не начали отправку, потому что, насколько я знаю, synchronized
нечестно, Боб может получить блокировкудо какого-то другого потока, который ждал дольше.
Мне нужно, чтобы все вызовы, сделанные на sendMessage
до X , выполняли свою работу нормально, а вызовы, сделанные после X выбросить ошибку.Как я могу это сделать?
- Особенности: Bob - это чтение потока из входного потока сокета, а X - при получении сообщения "close"в этом потоке.