2010-06-24 13 views
6

Ho due fili. Primo uno invia i datagrammi con un loop multicast in loop; il secondo thread riceve i datagrammi utilizzando la stessa istanza di MulticastSocket in loop.Java MulticastSocket è thread-safe?

Sembra funzionare correttamente, ma sono ancora in dubbio.

Questi due thread possono utilizzare la stessa istanza di MulticastSocket? MulticastSocket è thread-safe rispetto al richiamo dei metodi di invio/ricezione?

+0

Dubito che sarebbe importante se il socket fosse multicast o meno. – sje397

+0

OK. Due thread possono usare lo stesso socket per leggere/scrivere da/verso esso contemporaneamente? – Lopotun

risposta

6

Entrambi i metodi di invio e ricezione di DatagramSocket sono sincronizzati sul pacchetto di datagrammi di invio/ricezione. In altre parole, se si utilizza uno stesso pacchetto datagramma per inviare e ricevere da due thread differenti, questi due metodi verranno sincronizzati poiché utilizzeranno lo stesso oggetto di un token di sincronizzazione.

È molto più facile capire una volta guardato il codice sorgente di DatagramSocket.

+0

Questo è tutto. Se utilizzo la stessa istanza di DatagramPacket, non posso inviare e ricevere DatagramPacket contemporaneamente da due thread diversi. – Lopotun

+0

No, non è possibile inviare e ricevere contemporaneamente la stessa istanza di DatagramPacket da due thread differenti. –

2

DatagramSocketis thread safe, MulticastSocket è una classe derivata, in conseguenza MulticastSocket.send è thread-safe, poiché l'accesso viene serializzato da un synchronized block.

+0

Bene, il link dice infatti che DatagramSocket è thread-safe. Tuttavia, non posso confermarlo guardando all'origine DatagramSocket. – Lopotun

+0

Proprio come Boris ha indicato sotto, a DatagramSocket # invia le linee 574-6 puoi vedere che send (DatagramPacket) è sincronizzato sul suo argomento, mentre l'intero metodo di ricezione DatagramSocket # è contrassegnato come sincronizzato. –

+0

Il link sopra riportato è semplicemente una copia dei post originariamente creati nei forum Sun Java. – EJP

Problemi correlati