2011-12-05 29 views
11

Tôi đang cố gắng tìm tài liệu chỉ ra nếu java.util.concurrent.Future là/không phải là luồng an toàn. Ví dụ: tôi có thể đưa ra một ví dụ tương lai tương tự cho nhiều luồng, tất cả sẽ gọi là Future.get (...)?Là java.util.concurrent.Future threadsafe?

Tôi đã thử nghiệm mã bằng cách sử dụng tương lai theo cách này và nó có vẻ làm việc tốt nhưng tôi sẽ hạnh phúc hơn nhiều nếu tôi có thể tìm thấy kỳ vọng tài liệu rằng tương lai là an toàn để truy cập đồng thời theo cách này.

Cảm ơn.

+2

Về cơ bản, nhận xét này giống như câu trả lời của Nizet: bạn có thể thấy sự nhất quán về bộ nhớ đảm bảo trong JDK javadoc: http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/package- summary.html # package_description –

+0

Có an toàn để đọc "Các hành động được thực hiện bởi tính toán không đồng bộ được biểu diễn bằng một tương lai xảy ra trước khi các hành động tiếp theo truy xuất kết quả qua Future.get() trong một chuỗi khác". là đúng cho _many_ chủ đề khác cũng như một chủ đề khác? - "một chủ đề khác" đọc theo nghĩa đen chỉ ra một ** đơn ** chủ đề khác như trái ngược với nhiều. Có vẻ như một người thực hiện trong tương lai sẽ phải đi ra khỏi con đường của họ để làm cho nó phá vỡ nhiều và làm việc cho một vì vậy tôi mạnh mẽ nghi ngờ điều này là an toàn trong thực tế. – S42

+1

Có, bởi vì mỗi cuộc gọi đến 'Future.get()' sẽ được bảo đảm "xảy ra trước". Đó là bởi vì mỗi cuộc gọi được biên dịch đến cùng một hội đồng liên quan đến một hoặc một dạng khác của http://en.wikipedia.org/wiki/Memory_barrier –

Trả lời

9

Vì tương lai được dự định sử dụng bởi một số luồng (ít nhất là luồng và cho rằng tài liệu xác định rằng có một mối quan hệ xảy ra trước đó giữa tính toán không đồng bộ và các hành động xảy ra sau khi nhận cuộc gọi, tôi sẽ giả định rằng việc triển khai là an toàn luồng (ít nhất là triển khai chuẩn).

+1

Tôi rất muốn đồng ý rằng nó gần như chắc chắn là an toàn trong thực tế cho rằng thread-safety cho xảy ra trước khi làm việc giữa 2 chủ đề cũng sẽ tốt cho N threads, tuy nhiên tôi không rõ 100% nếu tôi có thể giải thích xảy ra trước khi được đảm bảo cho nhiều chủ đề khi từ ngữ của bảo đảm đề xuất một chuỗi khác. Mặc dù đặt phòng nhỏ tôi đang bỏ phiếu bình luận của bạn vì nó có vẻ là câu trả lời tốt nhất có sẵn. – S42

+1

@ S42 Bạn đang đọc từ ngữ theo nghĩa đen. Trong Java, hoàn toàn không có giao tiếp đặc biệt giữa một cặp luồng; tất cả các chủ đề giao tiếp bằng cách đồng bộ hóa bộ nhớ, và nó là như nhau có sẵn cho tất cả các chủ đề. – toto2

4

Nếu bạn đang sử dụng Future được trả lại từ số ExecutorService, thì có, chúng được đảm bảo an toàn chỉ. Vì Future là một giao diện, người tạo ra giao diện không thể đảm bảo rằng tất cả các triển khai sẽ là luồng an toàn.

Tuy nhiên, Nizet mang đến một điểm tốt. Tài liệu nói rằng việc triển khai giao diện Tương lai phải là luồng an toàn, không làm cho luồng an toàn thực hiện sẽ vi phạm hợp đồng của tương lai

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