Java : Is ServerSocket. 接受线程安全吗?

标签 java multithreading thread-safety

在学校的一个项目中,我们正在用 Java 5.0 制作一个多线程服务器。该项目以服务器的并发方面为中心。

我们有一些专用于处理请求的线程。为此,他们调用 ServerSocket.accept() 来接受新连接。我们的选择是启动一堆它们并让它们在假设两个线程不能同时接受()同一连接的情况下处理传入连接。

但现在的主要问题是我们无法在 API 中找到任何可以保证这种行为的东西(或者我们看起来不对),除了“有效”的证据之外我们什么也没有。

有人可以找到有关 java 方法的此类信息的来源吗?

最佳答案

简短回答:如果文档没有指定某些东西是线程安全的,那么您必须假设它不是。您需要自己进行线程之间的协调,以确保不会有两个线程同时使用服务器套接字。

这一点尤其重要,因为其他一些代码可能已使用 ServerSocket.setSocketFactory 注册了自己的套接字实现。 .即使默认套接字实现是线程安全的,自定义实现也不一定是。文档中没有任何内容这样说。

长答案:默认 Windows 实现

您可以下载并查看 java SE 1.6 source code .

我从 \j2se\src\share\classes\java\net\ServerSocket.java 开始,从那里开始找到 PlainSocketImpl.javaPlainSocketImpl.Accept 方法被标记为 native

Windows 的原生 C++ 代码在 \j2se\src\windows\native\java\net\PlainSocketImpl.c 中。它使用 winsock accept功能。来自MSDN article on WinSock (强调我的):

Under Windows NT and Windows 2000, Windows Sockets support for 16-bit applications is based on WINSOCK.DLL. For 32-bit applications, the support is in WSOCK32.DLL. The APIs provided are identical except that the 32-bit versions have parameters widened to 32 bits. Under Win32, thread safety is supplied.

所以至少在 Windows 上,Socket.Accept 是线程安全的,因为它不会让两个线程接受同一个连接。 ServerSocket 实现中也有一些基础结构(例如 Close() 方法使用锁),表明它是线程安全的。

关于Java : Is ServerSocket. 接受线程安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/896789/

相关文章:

java - java.awt.GraphicsConfiguration 是线程安全的吗?有哪些替代方案

Object[][] 的 Java 字段描述符

java - 线程安全类正在终止

java - Android 许可证检查失败太多,我做错了什么吗?

multithreading - 对信号量的 wait() 操作的实现感到困惑

c++ - 在多线程应用程序中使用 ptrace

Java对象实现Runnable,如何从集合中移除对象

c# - 当 ConcurrentQueue 有太多项目时工作线程阻塞

java - DeleteByName 方法不适用于 RandomAccessFile

java - Spring @ControllerAdvice Handler 异常没有选择 NoHandlerFoundException