Entonces, tengo dos hilos.¿Es seguro un subproceso PrintWriter de socket Java?
El hilo uno gestiona las conexiones del cliente. (Solo hay un cliente y un servidor)
Lo llamo mi hilo de servidor.
El subproceso dos gestiona el envío de mensajes al cliente. Lo llamo mi hilo de procesador de mensajes.
El hilo uno es responsable, entre otras cosas, de enviar un latido del corazón al cliente periódicamente.
Cuando programé, asumí que los sockets no eran seguros para subprocesos, pero los búferes sí, y siempre que utilizara búferes separados para el servidor y los hilos del procesador, estaría bien.
También he hecho la suposición de que la "PrintWriter" era análoga a la memoria intermedia de socket en Java.
Bajo estos supuestos escribí esta función para enviar un latido del corazón:
public void sendHeartBeat(){
logger.info("Sending a hearbeat!");
PrintWriter printWriter=null;
try {
printWriter = new PrintWriter(clientSocket.getOutputStream());
} catch (IOException e) {
logger.info(e.toString());
}
if(printWriter!=null){
printWriter.print("HEARTBEAT#");
printWriter.flush();
}
}
El otro hilo, el "procesador" hace algo similar, ya que hace:
printWriter=new PrintWriter(theServer.getClientSocket().getOutputStream());
De esta manera, Crearía un nuevo "buffer" cada vez que deseara enviar un latido, y mis mensajes nunca serían sobrescritos.
Desafortunadamente, este no parece ser el caso. Y me sale un mensaje que viene a través de la tubería de la siguiente manera: dsgdsbHEARTBEAT # SDG
Esto provoca un volcado de memoria más tarde.
Aquí están mis preguntas:
1) Los enchufes son, obviamente, no seguro para subprocesos, pero son los PrintWriters que recibo de ellos hilo de seguridad? ¿O solo está devolviendo el mismo PrintWriter?
2) ¿Qué es análogo al buffer de socket en Java? ¿Cómo debería pensar sobre este problema?
3) ¿Cómo puedo hacer para que estos hilos no escriban en el mismo buffer en el socket?
Eché un vistazo a Java SE 1.6.0_31 src para esto. 'PrintWriter (Writer out)' finalmente llama 'Writer protegido (bloqueo de objetos)' y allí, 'Writer' asigna este 'bloqueo' a su 'bloqueo' interno que se usa en 'Writer' para la sincronización. Así que podrías pl explica por qué crees que el bloqueo está roto aquí? – shrini1000
@ shrini1000 'PrintWriter' llama a' Writer (Object lock) 'con' super (out); '. Entonces 'lock' es' out', en lugar de 'out.lock'. (Este es un problema de implementación: parece que falta la especificación). –
Este parece ser el caso en Java 8 - PrintWriter llama a super (out) y lock está fuera en lugar de out.lock. –