简短的回答:如果文档没有指定某些东西是线程安全的,那么你必须假设它不是。您需要自己完成线程之间的协调,以确保没有两个线程同时使用服务器套接字。
这一点尤其重要,因为其他一些代码可以在ServerSocket.setSocketFactory
注册自己的套接字实现。即使默认套接字实现是线程安全的,自定义实现也不必是线程安全的。文档中没有任何内容是这么说的。
长答案:默认 Windows 实现
您可以下载并检查 java SE 1.6 源代码。
我从开始,从那里开始,小径通向.该方法被标记为 。\j2se\src\share\classes\java\net\ServerSocket.java
PlainSocketImpl.java
PlainSocketImpl.Accept
native
窗口的本机C++代码位于 中。它使用 winsock accept 函数。来自一篇关于WinSock的MSDN文章(强调我的):\j2se\src\windows\native\java\net\PlainSocketImpl.c
在 Windows NT 和 Windows 2000 下,Windows Sockets 对 16 位应用程序的支持基于 WINSOCK.DLL。对于 32 位应用程序,支持在 WSOCK32.DLL。提供的 API 是相同的,只是 32 位版本的参数已加宽到 32 位。在 Win32 下,提供线程安全性。
因此,至少在Windows上,线程安全,因为它不会让两个线程接受相同的连接。实现中还有基础设施(例如,Close()方法使用锁),这表明它是线程安全的。Socket.Accept
ServerSocket