자바 소켓의 스레드 안전이 stackoverflow에 대한 여러 스레드에서 논의 된 것을 알고 있지만이 질문에 대한 명확한 대답을 찾을 수 없었습니다. 실제로는 안전합니까? 여러 스레드가 동시에 같은 SocketOutputStream에 쓰거나 한 스레드에서 보낸 데이터가 다른 스레드의 데이터와 섞일 위험이 있습니까? (예를 들어 상대방의 수신자는 한 스레드의 메시지의 첫 번째 절반을 수신 한 다음 다른 스레드의 메시지에서 나머지 데이터를 수신 한 다음 나머지 스레드의 메시지를 수신합니다.)스레드 안전성 SocketOutputStream
"실제로" 나는 Socket 클래스가 thread-safe로 문서화되어 있지 않다는 것을 안다.하지만 현재 구현에서 실제로 안전하다면, 나를 위해 충분하다. 가장 흥미로운 점은 Linux에서 실행되는 핫스팟입니다.
핫 스폿 구현의 Java 레이어, 특히 SocketOutputStream에서 socketWrite()를 구현하면 socketWrite0()의 네이티브 구현이 안전하다면 스레드로부터 안전해야하는 것처럼 보입니다. 그러나, 그 방법 (j2se/src/solaris/native/java/net/SocketOutputStream.c)의 구현을 보면 64 비트인지 128 비트인지 (64 비트인지 여부에 따라) JVM) 그리고 청크를 별도의 쓰기로 보냅니다.
다른 스레드에서 64kb 이상 보내는 것은 안전하지 않지만 64kb 미만이면 안전해야하지만 여기서는 중요한 것을 놓칠 수 있습니다. 여기서 다른 사람이 이것을보고 다른 결론에 도달 했습니까?
는 생산자가 추가 (쓰기)와 소비자 (보낸 사람) 보낼 전면 떨어져 물건을 가져옵니다하는 BlockingDeque를 가진 생산자/소비자 모델을 가질 수있다 .. 동의했다. – sjr
시간을내어 답변 해 주셔서 감사합니다. 그것이 좋은 생각인지 아닌지는 논쟁의 여지가 있습니다.개인적으로 나는 특정 구현에 의존하는 일을하는 것이 아이디어에 나쁜 것이라고 생각하지 않는다. "어디서나 쓸 수있는 한 번 작성"아이디어 외에 자바를 사용하려는 다른 많은 이유가 있습니다. 성능이 중요한 경우 모든 구현에서 코드를 실행할 수 있다는 것은 기꺼이 삭제할 수있는 요구 사항입니다. – oscar11
필자는 쓰기를 둘러싼 잠금을 추가하거나 별도의 스레드를 사용하여 단일 작성자 만 있고 차단 큐는 문제를 "해결"한다는 것을 알고 있습니다. 블로킹 큐를 사용하면 불행히도 내 요구 사항에 너무 많은 대기 시간을 추가 할 수 있습니다. 쓰기 액세스를 동기화하면 실제로 안전 할 수 있지만 실제로 필요하지 않은 경우에는 피하는 것이 좋습니다. – oscar11