짧은 답변 :
코드는해야 이런 식으로 뭔가를 보이는 문서가 당신이 그렇지 않은 가정해야한다, 무언가가 스레드 안전하다는 것을 지정하지 않는 경우. 두 스레드가 동시에 서버 소켓을 사용하지 않도록 스레드간에 조정해야합니다. 다른 코드 ServerSocket.setSocketFactory
와 함께 자신의 소켓 구현을 등록 할 수 있기 때문에
이 특히 중요합니다. 기본 소켓 구현이 스레드로부터 안전하더라도 사용자 정의 구현은 필요하지 않습니다. 문서에 아무것도 언급되어 있지 않습니다.
긴 대답 : 당신은 다운로드하고 java SE 1.6 source code를 검사 할 수있는 기본 Windows 구현
.
내가 \j2se\src\share\classes\java\net\ServerSocket.java
에서 시작하여 거기에서 흔적이 PlainSocketImpl.java
으로 이어진다. PlainSocketImpl.Accept
메서드는 native
으로 표시됩니다.
Windows 용 기본 C++ 코드는 \j2se\src\windows\native\java\net\PlainSocketImpl.c
입니다. 그것은 winsock accept 기능을 사용합니다. MSDN article on WinSock (강조 광산)에서 :
Windows NT 및 Windows 2000에서
, 16 비트 응용 프로그램에 대한 Windows 소켓 지원은 WINSOCK.DLL을 기반으로합니다. 32 비트 응용 프로그램의 경우 은 WSOCK32.DLL에 있습니다. 제공된 의 API는 32 비트 버전의 매개 변수가 32 비트로 넓어지는 것을 제외하고는 동일합니다. Win32에서 스레드 안전성은 입니다.
그래서 적어도 창에, Socket.Accept
는 두 개의 스레드가 같은 연결을 허용 못하게한다는 점에서 스레드로부터 안전합니다. 또한 구현 (예를 들어,지. Close() 메서드는 스레드 안전성을 나타내는 잠금을 사용합니다.
이 디자인은별로 좋지 않으며 이미 작업자 스레드 풀을 사용하도록 변경했습니다. 이제는 요청을 수락하고 작업자 스레드로 보내는 단 하나의 스레드 만 있습니다. Java 메소드의 스레드 안전성에 대한 정보가 있다면 알 수 있습니다. –