2010-06-24 12 views
6

Ich habe zwei Threads. Zuerst sendet man Datagramme mit einer MulticastSocket in Schleife; Der zweite Thread empfängt Datagramme mit der gleichen Instanz von MulticastSocket in Schleife.Ist Java MulticastSocket threadsafe?

Es scheint zu funktionieren, aber ich bin immer noch in Zweifeln.

Können diese beiden Threads die gleiche Instanz von MulticastSocket verwenden? Ist MulticastSocket threadsafe in Bezug auf den Aufruf von send/receive Methoden?

+0

Ich bezweifle, es wäre egal, ob der Socket Multicast ist oder nicht. – sje397

+0

OK. Können zwei Threads den gleichen Socket zum gleichzeitigen Lesen/Schreiben verwenden? – Lopotun

Antwort

6

Sowohl das Senden als auch das Empfangen von DatagramSocket-Methoden werden im sendenden/empfangenden Datagrammpaket synchronisiert. Mit anderen Worten, wenn Sie dasselbe Datagrammpaket zum Senden und Empfangen von zwei verschiedenen Threads verwenden, werden diese beiden Methoden synchronisiert, da sie dasselbe Objekt wie ein Synchronisationstoken verwenden.

Es ist viel einfacher zu verstehen, wenn man einmal auf den Quellcode von DatagramSocket schaute.

+0

Das ist alles. Wenn ich dieselbe Instanz von DatagramPacket verwende, kann ich das DatagramPacket nicht gleichzeitig von zwei verschiedenen Threads senden und empfangen. – Lopotun

+0

Nein, Sie können dieselbe Instanz von DatagramPacket nicht gleichzeitig aus zwei verschiedenen Threads senden und empfangen. –

2

DatagramSocketis thread safe ist MulticastSocket ein Derivat der Klasse, in Folge MulticastSocket.send threadsicher ist, da der Zugang durch eine synchronized block serialisiert wird.

+0

Nun, die Verbindung sagt tatsächlich, dass DatagramSocket threadsafe ist. Ich kann jedoch nicht bestätigen, dass DatagramSocket als Quelle betrachtet wird. – Lopotun

+0

Wie Boris unten gezeigt hat, können Sie bei DatagramSocket # send lines 574-6 sehen, dass send (DatagramPacket) über sein Argument synchronisiert wird, während die gesamte DatagramSocket # receive-Methode als synchronisiert markiert wird. –

+0

Der obige Link ist lediglich eine Kopie von Posts, die ursprünglich in den Sun Java-Foren erstellt wurden. – EJP