그래서 두 개의 스레드가 있습니다.Java 소켓의 PrintWriter 스레드가 안전합니까?
스레드 1은 클라이언트 연결을 관리합니다. (단 하나의 클라이언트와 하나의 서버가 있습니다.)
나는 이것을 내 서버 스레드라고 부릅니다.
스레드 2는 클라이언트에 메시지를 보내는 것을 관리합니다. 나는 그것을 내 메시지 프로세서 스레드라고 부른다.
스레드 하나는 클라이언트에 주기적으로 하트 비트를 보내는 역할을 담당합니다.
프로그래밍 할 때 소켓이 스레드 안전하지 않았지만 버퍼가 있고 서버와 프로세서 스레드에 별도의 버퍼를 사용하는 한 정상이라고 가정했습니다.
또한 "PrintWriter"가 Java의 소켓 버퍼와 비슷하다고 가정했습니다. 이러한 가정 하에서
나는 하트 비트 전송이 기능을 썼다
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();
}
}
다른 스레드의 "프로세서"한 그 비슷한 무언가를 그것을 수행합니다
printWriter=new PrintWriter(theServer.getClientSocket().getOutputStream());
을 이러한 방식으로 하트 비트를 보내려고 할 때마다 새로운 "버퍼"를 만들 것이고, 내 메시지는 결코 덮어 쓰지 않을 것입니다.
불행하게도이 경우가 아닌 것 같습니다. 그리고 다음과 같이 파이프를 통해 오는 메시지가 나타납니다. dsgdsbHEARTBEAT # sdg
이렇게하면 나중에 코어 덤프가 발생합니다.
1 소켓 분명히 스레드 안전하지 않음),하지만 난 그들로부터 얻을 PrintWriters 스레드 안전 :
여기 내 질문은? 아니면 그냥 동일한 PrintWriter를 반환입니까?
2) Java의 소켓 버퍼와 비슷한 점은 무엇입니까? 이 문제에 대해 어떻게 생각해야합니까?
3)이 스레드가 소켓의 동일한 버퍼에 쓰지 않도록하려면 어떻게해야합니까?
자바 SE 1.6.0_31 src를 살펴 보았습니다. 'PrintWriter (Writer out)'는 궁극적으로 보호 된 Writer (Object Lock)를 호출하고 'Writer'는이 'Lock'을 'Writer'에서 동기화에 사용되는 내부 'Lock'에 할당합니다. 그럼 너도 그럴 수있어. 왜 여기에 잠금 장치가 고장 났다고 생각하는지 설명해주십시오. – shrini1000
@ shrini1000'PrintWriter'는'Writer (Object lock)'를'super (out);'로 호출합니다. 그러므로'lock.lock' 대신'lock'이'out'입니다. (이것은 구현상의 문제입니다. 사양이 누락 된 것으로 보입니다.) –
Java 8 - PrintWriter에서 super (out)을 호출하고 out.lock 대신 lock이있는 경우에도 여전히 나타납니다. –