2010-06-24 16 views
6

Tengo dos hilos. El primero envía datagramas con un MulticastSocket en bucle; el segundo subproceso recibe datagramas utilizando la misma instancia de MulticastSocket en bucle.¿Java MulticastSocket es seguro?

Parece que funciona correctamente, pero todavía tengo dudas.

¿Pueden estos dos hilos utilizar la misma instancia de MulticastSocket? ¿MulticastSocket es seguro para los hilos en relación con la invocación de métodos de envío/recepción?

+0

Dudo que importaría si el zócalo es multidifusión o no. – sje397

+0

OK. ¿Pueden dos hilos usar el mismo zócalo para leer/escribir desde/a él simultáneamente? – Lopotun

Respuesta

6

Tanto el envío como la recepción de los métodos DatagramSocket están sincronizados en el paquete de datagrama de envío/recepción. En otras palabras, si está utilizando un mismo paquete de datagramas para enviar y recibir desde dos subprocesos diferentes, estos dos métodos se sincronizarán, ya que van a usar el mismo objeto como un token de sincronización.

Es mucho más fácil de entender una vez que se mira el código fuente de DatagramSocket.

+0

Eso es todo. Si utilizo la misma instancia de DatagramPacket, entonces no puedo enviar y recibir el DatagramPacket simultáneamente desde dos hilos diferentes. – Lopotun

+0

No, no puede enviar y recibir simultáneamente la misma instancia de DatagramPacket desde dos subprocesos diferentes. –

2

DatagramSocketis thread safe, MulticastSocket es una clase derivada, en consecuencia MulticastSocket.send es thread-safe, ya que el acceso está siendo serializado por un synchronized block.

+0

Bueno, el enlace dice que DatagramSocket es seguro para los hilos. Sin embargo, no puedo confirmarlo mirando el origen de DatagramSocket. – Lopotun

+0

Al igual que Boris señaló a continuación, en DatagramSocket # enviar líneas 574-6 puede ver que el envío (DatagramPacket) está sincronizado sobre su argumento, mientras que todo el método DatagramSocket # receive está marcado como sincronizado. –

+0

El enlace anterior es simplemente una copia de las publicaciones que se hicieron originalmente en los foros de Sun Java. – EJP