Câu trả lời ngắn: nếu tài liệu không xác định rằng cái gì là chủ đề an toàn, sau đó bạn phải thừa nhận rằng nó không phải là. Bạn cần phải phối hợp giữa các luồng để đảm bảo rằng không có hai luồng nào sử dụng socket máy chủ cùng một lúc.
Điều này đặc biệt quan trọng vì một số mã khác có thể đã đăng ký triển khai socket riêng của mình với ServerSocket.setSocketFactory
. Ngay cả khi việc triển khai socket mặc định là an toàn luồng, việc triển khai tùy chỉnh không nhất thiết phải như vậy. Không có gì trong tài liệu nói như vậy.
Long trả lời: mặc định của Windows Thực hiện
Bạn có thể tải về và kiểm tra việc java SE 1.6 source code.
Tôi bắt đầu tại \j2se\src\share\classes\java\net\ServerSocket.java
và từ đó đường nhỏ dẫn đến PlainSocketImpl.java
. Phương pháp PlainSocketImpl.Accept
được đánh dấu là native
.
Mã C++ gốc cho cửa sổ nằm trong \j2se\src\windows\native\java\net\PlainSocketImpl.c
. Nó sử dụng hàm winsock accept. Từ một (tôi nhấn mạnh) MSDN article on WinSock:
Dưới Windows NT và Windows 2000, Windows Sockets hỗ trợ cho ứng dụng 16-bit được dựa trên WINSOCK.DLL. Đối với các ứng dụng 32 bit, hỗ trợ nằm trong WSOCK32.DLL. Các API được cung cấp giống hệt nhau ngoại trừ các phiên bản 32 bit có tham số được mở rộng đến 32 bit. Theo Win32, an toàn chủ đề là được cung cấp.
Vì vậy, ít nhất là trên cửa sổ, Socket.Accept
là chủ đề an toàn theo nghĩa là nó sẽ không cho phép hai luồng chấp nhận cùng một kết nối. Cũng có cơ sở hạ tầng trong việc thực hiện ServerSocket
(e.g. phương thức Close() sử dụng khóa) cho biết rằng nó được dự định là luồng an toàn.
Nguồn
2009-05-22 14:44:39
Chúng tôi biết rằng thiết kế này không thực sự tốt và chúng tôi đã thay đổi nó để sử dụng một nhóm các chuỗi công nhân. Bây giờ chúng ta chỉ có một luồng chấp nhận và gửi các yêu cầu tới các luồng công nhân. Tôi vẫn sẽ biết liệu có thông tin nào đó về chủ đề an toàn của các phương pháp java hay không. –