Применяют ли методы `asynchronoussocketchannel.write` и` Read` забор памяти, прежде чем называть методы `edialhionhandleJAVA

Программисты JAVA общаются здесь
Anonymous
Применяют ли методы `asynchronoussocketchannel.write` и` Read` забор памяти, прежде чем называть методы `edialhionhandle

Сообщение Anonymous »

При использовании asynchronoussocketchannel.write для передачи сообщения,

Код: Выделить всё

    class Transmitter(channel: AsynchronousSocketChannel) {
def transmit(bytes: Array[Byte])(onComplete: Consumer[String]): Unit = {
val buffer = ByteBuffer.wrap(bytes)

object handler extends CompletionHandler[Integer, Null] {
override def completed(result: Integer, attachment: Null): Unit = {
if result == 0 then onComplete.accept("Failure: connection closed prematurely")
else if buffer.hasRemaining then channel.write(buffer, null, handler)
else onComplete.accept("Successful")

}

override def failed(exc: Throwable, attachment: Null): Unit = onComplete.accept("Failure: connection error")
}
channel.write(buffer, null, handler)
}
}
Метод завершения handhandler.completed может быть вызван до отправки всего содержимого буфера, верно? Чтобы обратиться с этим случаем, выполненный метод должен вызвать Asynchronoussocketchannel.write Еще раз, верно? выполнено в другом потоке группы Nio2, и документация Buffer < /code> говорит, что она не безопасна для потока (его переменные состояния даже не нестабильны). Отправьте оставшееся содержание буфера без чтения буфера, и его нельзя надежно прочитать. Последовательно), но наглядно: поток, который запускает выполняемый метод , может не увидеть изменения переменных состояния Buffer , сделанные потоком, в котором называется write или поток, который выполнял завершенные a Предыдущий раз. Методы внутри. ). Делай или не требует быть изменчивым.


Подробнее здесь: https://stackoverflow.com/questions/794 ... ry-fence-b

Вернуться в «JAVA»