Réponse courte: si la documentation ne précise pas que quelque chose est thread-safe, vous devez supposer que ce n'est pas. Vous devez effectuer vous-même la coordination entre les threads pour vous assurer que deux threads n'utilisent pas la socket serveur en même temps.
Ceci est particulièrement important car un autre code pourrait avoir enregistré sa propre implémentation de socket avec ServerSocket.setSocketFactory
. Même si l'implémentation de socket par défaut est thread-safe, les implémentations personnalisées ne doivent pas l'être. Il n'y a rien dans la documentation qui le dit.
Réponse longue: la mise en œuvre par défaut de Windows
Vous pouvez télécharger et inspecter le java SE 1.6 source code.
J'ai commencé à \j2se\src\share\classes\java\net\ServerSocket.java
et à partir de là, la piste a conduit à PlainSocketImpl.java
. La méthode PlainSocketImpl.Accept
est marquée native
. Le code C++ natif de Windows est \j2se\src\windows\native\java\net\PlainSocketImpl.c
. Il utilise la fonction winsock accept. D'un MSDN article on WinSock (Souligné par l'auteur):
Sous Windows NT et Windows 2000, support Windows Sockets 16 bits applications est basée sur WINSOCK.DLL. Pour les applications 32 bits, le support se trouve dans WSOCK32.DLL. Les API fournies sont identiques, sauf que les versions 32 bits ont des paramètres élargis à 32 bits. Sous Win32, la sécurité du fil est fournie.
Ainsi, au moins sur les fenêtres, Socket.Accept
est thread-safe dans le sens où il ne laissera pas deux fils acceptent la même connexion. Il existe également une infrastructure dans l'implémentation ServerSocket
(e.g. la méthode Close() utilise un verrou) qui indique qu'il est destiné à être thread-safe.
Nous savons que cette conception n'est pas vraiment bonne et nous l'avons déjà modifiée pour utiliser un pool de threads de travail. Maintenant nous avons seulement un thread qui accepte et envoie les demandes aux threads de travail. Je serais toujours savoir s'il existe des informations quelque part sur la thread-sécurité des méthodes Java. –