2012-05-07 6 views
5

자바 소켓의 스레드 안전이 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 미만이면 안전해야하지만 여기서는 중요한 것을 놓칠 수 있습니다. 여기서 다른 사람이 이것을보고 다른 결론에 도달 했습니까?

답변

5

나는 이 실제로이라고 생각하는데, 당신의 통제를 넘어서 변화 할 수있는 무언가의 구현 세부 사항에 크게 의존하고 있습니다. 이런 식으로하면 의 버전을 매우 조심스럽게 제어해야합니다. 당신이 기대하는 바를 확실히하기 위해 사용하기 때문에 매우 어렵습니다. 또한 솔루션의 StackOverflow에있는 코드 검사 및 rumom의 소문에 의존하기 때문에 멀티 스레드 운영 체제가 올바르게 작동하는지 확인하기 위해 매우 강력한 테스트 슈트가 있어야합니다.

왜 SocketOutputStream을 다른 패스 스루 OutputStream으로 포장 한 다음 그 수준에서 필요한 동기화를 추가 할 수 없습니까? 그렇게하는 것이 훨씬 안전하며 예상치 못한 문제가 발생할 확률이 훨씬 적습니다.

+1

는 생산자가 추가 (쓰기)와 소비자 (보낸 사람) 보낼 전면 떨어져 물건을 가져옵니다하는 BlockingDeque를 가진 생산자/소비자 모델을 가질 수있다 .. 동의했다. – sjr

+0

시간을내어 답변 해 주셔서 감사합니다. 그것이 좋은 생각인지 아닌지는 논쟁의 여지가 있습니다.개인적으로 나는 특정 구현에 의존하는 일을하는 것이 아이디어에 나쁜 ​​것이라고 생각하지 않는다. "어디서나 쓸 수있는 한 번 작성"아이디어 외에 자바를 사용하려는 다른 많은 이유가 있습니다. 성능이 중요한 경우 모든 구현에서 코드를 실행할 수 있다는 것은 기꺼이 삭제할 수있는 요구 사항입니다. – oscar11

+0

필자는 쓰기를 둘러싼 잠금을 추가하거나 별도의 스레드를 사용하여 단일 작성자 만 있고 차단 큐는 문제를 "해결"한다는 것을 알고 있습니다. 블로킹 큐를 사용하면 불행히도 내 요구 사항에 너무 많은 대기 시간을 추가 할 수 있습니다. 쓰기 액세스를 동기화하면 실제로 안전 할 수 있지만 실제로 필요하지 않은 경우에는 피하는 것이 좋습니다. – oscar11

2

이 설명서에 따르면 http://www.docjar.com/docs/api/java/net/SocketOutputStream.html 클래스는 스레드로부터 안전하다고 주장하지 않으므로이를 가정하지 않습니다. FileOutputStream을 상속합니다. FileOutputStream은 일반적으로 파일 I/O가 본래 스레드로부터 안전하지 않습니다.

클래스가 하드웨어 나 통신과 관련되어 있다면 스레드 안전 또는 "차단"이 아니라는 점이 좋습니다. 그 이유는 스레드 안전 작업이 더 많은 시간을 소비하기 때문입니다. 내 배경은 Java가 아니지만 다른 라이브러리는 철학과 비슷합니다.

수업을 광범위하게 테스트 했음에도 불구하고 며칠 동안 하루 종일 테스트 할 수 있으며 내 2 센트는 아무것도 증명하지 못할 수도 있습니다.

행운을 빌어 요. &은 재미 있습니다.

토미 Kwee는