2016-11-30 22 views

Trả lời

4

Tôi không thể đảm bảo rằng WebSocketClient là chủ đề 100% an toàn, nhưng tôi có thể nói rằng nó có nghĩa là để được an toàn chủ đề, đến một mức độ nhất định.

Nhìn vào source code, chúng ta thấy rằng phương pháp riêng initializeClient được đồng bộ:

private synchronized void initializeClient() throws IOException 

và rằng phương pháp connect đang sử dụng một Executor:

// Execute the connection on the executor thread 
executor.execute(promise); 

Các tài liệu của lớp nói gì về an toàn chủ đề, nhưng cuộc gọi của phương thức initializeClient được đồng bộ từ phương pháp connect và việc sử dụng Executor là rõ ràng sig ns rằng một số hình thức đa luồng được hỗ trợ.

== Chỉnh sửa ==

An toàn chủ đề thường chỉ được đảm bảo cho một số loại hoạt động nhất định. Ví dụ, nó có thể được đảm bảo chỉ cho các hoạt động đọc và không phải cho các hoạt động ghi. Đây là vai trò của tài liệu hướng dẫn để xác định các điều kiện an toàn của luồng. Nhận xét của Sergio Montoro là đúng, nếu một chủ đề sửa đổi đối tượng trong quá trình sử dụng nó bằng một luồng khác, những điều kỳ lạ có thể xảy ra. Trong trường hợp của WebSocketClient an toàn chủ đề chắc chắn là ít nhất bị giới hạn đối với việc không sửa đổi của đối tượng bằng các chủ đề khác, hoặc để sửa đổi đồng bộ và phối hợp của trạng thái nội bộ WebSocketClient.

+0

+1 WebSocketClient chắc chắn được viết thành chuỗi an toàn. Thực tế là _code đôi khi có thể chứa lỗi_ không có nghĩa rằng đây không phải là mã đa luồng. –

4

Nó không phải, từ the code đây là ít nhất một ví dụ tại sao:

Mục đích của WebSocketClient là để cung cấp một trung bình của thiết lập kết nối tới điểm cuối WebSocket từ xa.

Điều này đạt được bằng cách gọi phương thức connect(), trả về Phiên trong tương lai. Được rồi, bây giờ tưởng tượng rằng

  1. Chủ đề 1 instantiates một WebSocketClient và gọi setCookieStore()

  2. Chủ đề 1 cuộc gọi connect(Object websocket, URI toUri).

  3. Bên connect() Chủ đề 1 thực hiện

    ClientUpgradeRequest request = new ClientUpgradeRequest(toUri) 
    

    request.setRequestURI(toUri) 
    
  4. Chủ đề 2 thực hiện setCookieStore(CookieStore cookieStore)

Sau đó, theo yêu cầu tạo ra bởi Chủ đề 1 có thể có cookie tương ứng với URI của chủ đề 2.

Để đảm bảo an toàn luồng, trạng thái bên trong của đối tượng sẽ không thể sửa đổi được trong suốt quá trình kết nối.

+0

Không chắc Cửa hàng cookie trong WebSocketClient có ở đây để đặt cookie chung nên được chia sẻ giữa các cuộc gọi khác nhau không. Cookie theo yêu cầu phải được đặt bằng setCookies trên ClientUpgradeRequest. – benbenw

+0

Nếu cookieStore có nghĩa là để được chia sẻ trên các chủ đề thì nó sẽ được khai báo là 'bay hơi '. Nếu không, một luồng có thể thay đổi giá trị và giá trị kia không thấy thay đổi. Ngoài ra tôi không thấy trong lớp làm thế nào để giữ hai bộ cookie: chia sẻ giữa các chủ đề tập hợp con và tập con cho mỗi luồng. Hơn nữa, có thể nghĩ ra một trường hợp sử dụng hợp lý để tách cookie theo cách này trong hai tập hợp con không? –

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