2010-06-24 28 views
6

Tôi có hai chủ đề. Đầu tiên gửi datagram với MulticastSocket trong vòng lặp; thread thứ hai nhận datagrams bằng cách sử dụng cùng một instance của MulticastSocket trong vòng lặp.Chủ đề Java MulticastSocket có an toàn không?

Dường như nó hoạt động bình thường, nhưng tôi vẫn còn nghi ngờ.

Hai chủ đề này có thể sử dụng cùng một ví dụ của MulticastSocket không? Chủ đề MulticastSocket có phải là phương thức gửi/nhận phương thức gọi không?

+0

Tôi nghi ngờ việc ổ cắm có phát đa hướng hay không. – sje397

+0

OK. Hai luồng có thể sử dụng cùng một socket để đọc/ghi từ/đến cùng một lúc không? – Lopotun

Trả lời

6

Cả hai phương thức gửi và nhận DatagramSocket đều được đồng bộ hóa trên gói dữ liệu gửi/nhận. Nói cách khác, nếu bạn đang sử dụng một gói dữ liệu giống nhau để gửi và nhận từ hai luồng khác nhau thì hai phương thức này sẽ được đồng bộ hóa vì chúng sẽ sử dụng cùng một đối tượng như một mã thông báo đồng bộ hóa.

Dễ hiểu hơn nhiều khi đã xem mã nguồn của DatagramSocket.

+0

Đó là tất cả. Nếu tôi sử dụng cùng một trường hợp của DatagramPacket sau đó tôi không thể gửi và nhận DatagramPacket đồng thời từ hai chủ đề khác nhau. – Lopotun

+0

Không, bạn không thể đồng thời gửi và nhận cùng một phiên bản của DatagramPacket từ hai luồng khác nhau. –

2

DatagramSocketis thread safe, MulticastSocket là một lớp phái sinh, hậu quả là MulticastSocket.send là an toàn chỉ vì truy cập đang được nối tiếp bởi synchronized block.

+0

Vâng, liên kết thực sự nói rằng DatagramSocket là threadsafe. Tuy nhiên, tôi không thể xác nhận nó đang nhìn vào nguồn DatagramSocket. – Lopotun

+0

Cũng giống như Boris chỉ dưới đây, tại DatagramSocket # gửi dòng 574-6 bạn có thể thấy rằng gửi (DatagramPacket) được đồng bộ hóa đối số của nó, trong khi toàn bộ phương thức nhận được DatagramSocket # được đánh dấu là đồng bộ. –

+0

Liên kết trên chỉ là một bản sao của các bài đăng ban đầu được tạo ra trong các diễn đàn Sun Java. – EJP

Các vấn đề liên quan