2010-06-24 11 views
6

J'ai deux threads. Le premier envoie des datagrammes avec une boucle MulticastSocket en boucle; le deuxième thread reçoit des datagrammes utilisant la même instance de MulticastSocket en boucle.Le threads Java MulticastSocket est-il sécurisé?

Il semble fonctionner correctement, mais je suis toujours dans le doute.

Ces deux threads peuvent-ils utiliser la même instance de MulticastSocket? Le threads MulticastSocket respecte-t-il l'invocation des méthodes send/receive?

+0

Je doute que cela soit important que le socket soit multicast ou non. – sje397

+0

OK. Est-ce que deux threads peuvent utiliser le même socket pour lire/écrire simultanément? – Lopotun

Répondre

6

Les méthodes DatagramSocket d'émission et de réception sont synchronisées sur le paquet de datagramme d'envoi/de réception. En d'autres termes, si vous utilisez un même paquet de datagramme pour envoyer et recevoir à partir de deux threads différents, ces deux méthodes seront synchronisées car elles vont utiliser le même objet qu'un jeton de synchronisation.

Il est beaucoup plus facile de comprendre une fois regardé le code source de DatagramSocket.

+0

C'est tout. Si j'utilise la même instance de DatagramPacket, je ne peux pas envoyer et recevoir le DatagramPacket simultanément à partir de deux threads différents. – Lopotun

+0

Non, vous n'êtes pas en mesure d'envoyer et de recevoir simultanément la même instance de DatagramPacket à partir de deux threads différents. –

2

DatagramSocketis thread safe, MulticastSocket est une classe dérivée, par suite MulticastSocket.send est thread-safe, puisque l'accès est sérialisé par un synchronized block.

+0

Eh bien, le lien indique en effet que DatagramSocket est threadsafe. Cependant, je ne peux pas le confirmer en regardant la source DatagramSocket. – Lopotun

+0

Tout comme Boris pointé ci-dessous, sur les lignes d'envoi DatagramSocket # 574-6, vous pouvez voir que send (DatagramPacket) est synchronisé sur son argument, alors que toute la méthode de réception DatagramSocket # est marquée comme synchronisée. –

+0

Le lien ci-dessus est simplement une copie des articles qui ont été créés à l'origine dans les forums Sun Java. – EJP