de quelle façon est de java.net.Prise de thread-safe?
J'ai un Socket que je suis à la fois la lecture et l'écriture, par l'intermédiaire de BufferedReaders et BufferedWriters. Je ne suis pas sûr que les opérations qui sont d'accord de le faire à partir de plusieurs threads. Je suppose que l'écriture à la prise de deux threads différents en même temps est une mauvaise idée. Même avec la lecture de la prise de deux threads différents en même temps. Ce sujet de la lecture sur un fil lors de l'écriture sur un autre?
Je demande parce que je veux avoir un thread bloqué pendant un long moment sur un lire qu'elle attend plus de données, mais pendant cette attente j'ai aussi l'occasion, pour envoyer des données sur le support. Je ne suis pas clair si cela est thread-safe, ou si je dois annuler le lire avant d'écrire (ce qui serait gênant).
OriginalL'auteur lacker | 2011-07-12
Vous devez vous connecter pour publier un commentaire.
Vous lu à partir de InputStream et écrire à OutputStream. Ils sont assez indépendants, et aussi longtemps que vous le sérialiser l'accès à chacun d'eux, vous êtes ok.
Vous avez à mettre en corrélation, cependant, les données que vous envoyez avec les données que vous recevez. C'est différent de la sécurité des threads.
n'essayez pas d'écrire avec deux fils à la fois, ou de lire avec deux fils à la fois. Appelez les lectures/écritures de certains synchronisé bloc/méthode (un verrou pour la lecture, l'une pour l'écriture).
>>> tant que vous sérialiser l'accès à chacun d'eux: ce n'est pas suffisant pour faire de l'accès thread-safe, vous devez vous assurer que le support de l'état est géré à l'aide de la même serrure qui est utilisé pour sérialiser l'accès. Je recommande, il suffit de ne pas le faire. Utiliser des tampons, et de gérer la prise des lectures/écritures dans un thread
OriginalL'auteur Alex Gitelman
Sockets sont thread dangereux au niveau du ruisseau. Vous devez fournir la synchronisation. La seule garantie est que vous ne serez pas obtenir des copies des mêmes octets dans différents lire les invocations n'importe simultanéité.
Mais à un Lecteur et, spécialement, l'Écrivain niveau, vous pourriez avoir quelques les problèmes de verrouillage.
De toute façon, vous pouvez gérer les opérations de lecture et écriture avec le support du cours d'eau comme s'ils étaient complètement indépendant des objets (ils sont, la seule chose qu'ils partagent leur lifecyle).
Une fois que vous avez fourni la bonne synchronisation entre les threads de lecture d'une part, et écrivain, fils d'autre part, un certain nombre de lecteurs et d'écrivains va être correct. Cela signifie que, oui, vous pouvez lire sur un fil et d'écrire sur un autre (en fait, c'est très fréquent), et vous n'avez pas à arrêter de lire pendant l'écriture.
Un dernier conseil: toutes les opérations impliquant des threads délai associé, assurez-vous de gérer les délais d'attente correctement.
getInputStream()
n'est pas thread sauver, comme il neisConnected()
dans un pas thread-safe mode. C'est assez de ne pas l'utiliser par plusieurs threads à tous si vous ne fournissez pas de synchronisation.OriginalL'auteur mschonaker
Vous pouvez avoir un thread de lecture de la prise de courant et un autre thread d'écriture. Vous voudrez peut-être avoir un certain nombre de fils d'écriture à la prise, dans ce cas vous aurez à sérialiser vos accès avec la synchronisation ou vous pourriez avoir un seul thread d'écriture qui reçoit les données à écrire à partir d'une file d'attente. (Je préfère l'ancien)
Vous pouvez utiliser non bloquant IO et partager la lecture et de l'écriture de travailler dans un seul thread. Cependant, c'est en réalité plus complexe et difficile à obtenir le droit. Si vous voulez faire cela, je vous suggère d'utiliser une bibliothèque pour vous aider tels que Netty ou Mina.
OriginalL'auteur Peter Lawrey
Java
java.net.Socket
n'est en fait pas thread-safe: Ouvrez le support de la source, et de regarder l' (disons)connected
membre du terrain et la façon dont il est utilisé. Vous verrez que c'est pasvolatile
, lu et mis à jour sans synchrinization. Cela indique que la classe Socket n'est pas conçu pour être utilisé par plusieurs threads. Cependant, il existe certaines serrures et de synchronisation, il n'est pas cohérent.`Je recommande de ne pas le faire. Finalement, utiliser des tampons(nio), et ne socket lectures/écritures dans un thread
Pour plus de détails rendez-vous sur la discussionv
ce n'est pas seulement
connected
, un autre estcreated
. Souhaitez-vous avoir des comportement aléatoire, car laSocketImpl
n'est pas initialisé correctement lorsque vous essayez de l'utiliser?Je ne pense pas qu'il y a beaucoup de code qui accède à la simple Prise de threads différents. C'est parce que, généralement, vous disposez d'un protocole et de vous écrire basé sur ce que vous avez lu avant et l'autre manière autour. Faire cela dans différents threads (OMI) est très inhabituel
>>> le flux d'entrée est séparé du flux de sortie Si ce sont des objets différents, ne signifie pas qu'ils n'ont pas accès au même état de la prise. Parcourir un peu les sources de
Socket
,SocketImpl
,PlainSocketImpl
, etc, et vous verrez que les flots ont en fait état dans la commune. La classe n'étant pas conçu pour le multi-threading (me donner java-doc/spec qui le dit, c'est sûr) est une raison suffisante pour ne pas le faire>>> Il y a énormément de code Donnez-moi un exemple des logiciels libres du projet qui est en train de faire.
OriginalL'auteur Op De Cirkel
Très intéressant, le nio SocketChannel écrit sont synchronisés
http://www.docjar.com/html/api/sun/nio/ch/SocketChannelImpl.java.html
L'ancien Socket io choses dépendent du système d'exploitation de sorte que vous avez à regarder les OS du code natif pour en être sûr(et qui peuvent varier d'un OS à l'OS)...
Il suffit de regarder java.net.SocketOutputStream.java qui est ce Socket.getOutputStream retourne.
(à moins que j'ai raté quelque chose).
oh, encore une chose, ils auraient pu mettre de la synchronisation dans le code natif dans tous les JVM sur chaque OS, mais qui sait pour sûr. Seul le nio est évident que la synchronisation existe.
OriginalL'auteur Dean Hiller
C'est de cette façon socketWrite en code natif, donc ce n'est pas thread-safe à partir du code
OriginalL'auteur Xiaolong Jiang