Khi nào sử dụng từ khóa dễ bay hơi và đồng bộ hóa trong đa luồng?Khi nào nên sử dụng biến đổi so với đồng bộ hóa đa luồng trong java?
Trả lời
Sử dụng volatile
để đảm bảo rằng mỗi quyền truy cập đọc vào một biến sẽ thấy giá trị mới nhất được ghi vào biến đó. Sử dụng synchronized
bất cứ khi nào bạn cần giá trị ổn định cho nhiều hướng dẫn. (Lưu ý rằng điều này không nhất thiết có nghĩa nhiều câu lệnh; báo cáo kết quả duy nhất:.
var++; // NOT thread safe!
là không thread-an toàn ngay cả nếu var
được khai báo volatile
Bạn cần phải làm điều này:
synchronized(LOCK_OBJECT){var++;}
Xem here để có một bản tóm tắt tốt đẹp về vấn đề này
'AtomicLong' xử lý' var ++ 'với một phương thức và chỉ là trường' volatile'. Bạn có thể chỉnh sửa câu trả lời của mình để cung cấp ví dụ tốt hơn không? – Gray
@Gray - OK. "Ví dụ tốt hơn" của tôi là 'var' là kiểu' float'. –
Đó là một câu hỏi khá rộng. Câu trả lời hay nhất tôi có thể đưa ra là sử dụng synchronized
khi thực hiện nhiều hành động mà các chủ đề khác phải xem bằng cách xuất hiện nguyên tử — hoặc tất cả hoặc không có bước nào đã xảy ra.
Đối với một hành động, volatile
có thể là đủ; nó hoạt động như một rào cản bộ nhớ để đảm bảo khả năng hiển thị của sự thay đổi cho các chủ đề khác.
Biến động chỉ đảm bảo hoạt động đọc luôn cung cấp trạng thái mới nhất từ bộ nhớ qua các chủ đề. không đảm bảo bất kỳ việc viết an toàn/thứ tự các hoạt động nào, tức là hai luồng có thể cập nhật biến dễ bay hơi theo bất kỳ thứ tự ngẫu nhiên nào. Ngoài ra nó không đảm bảo rằng nhiều hoạt động trên biến là nguyên tử.
Tuy nhiên, khối đồng bộ đảm bảo trạng thái mới nhất và viết an toàn. Ngoài ra, truy cập và cập nhật biến là nguyên tử bên trong một khối được đồng bộ hóa. Ở trên, tuy nhiên là đúng, chỉ khi tất cả quyền truy cập/cập nhật cho biến được đề cập đang sử dụng cùng một đối tượng khóa để không có nhiều chủ đề truy cập vào biến.
Dễ bay hơi không có khóa, nó sử dụng kiến trúc CPU cơ bản để đảm bảo khả năng hiển thị trên tất cả các chuỗi sau khi ghi.
- 1. ReentrantReadWriteLock so với đồng bộ
- 2. Đồng bộ hóa, Khi nào hoặc không sử dụng?
- 3. C++ đồng bộ đa luồng
- 4. Tính chính xác đa luồng: Sử dụng khối đồng bộ
- 5. "đồng bộ hóa (điều này)" so với "đồng bộ ((BaseClass) này)" trong Java?
- 6. Đồng bộ hóa tệp tải lên đa luồng
- 7. Khi nào tôi nên sử dụng Hashtable so với HashMap
- 8. Hành vi lạ trong Java với truy cập không được đồng bộ hóa trong chương trình đa luồng
- 9. Khối Java được đồng bộ hóa so với Collections.synchronizedMap
- 10. Khi nào cần sử dụng đồng bộ trong Java
- 11. Trong Java, các phương thức không sử dụng biến tĩnh hoặc lớp cần phải được đồng bộ hóa?
- 12. Tôi nên sử dụng ThreadPool nào trong Java?
- 13. đồng bộ trong khi sử dụng AtomicInteger
- 14. Đồng bộ hóa trong Vectors trong Java
- 15. Khi nào tôi nên sử dụng ConcurrentSkipListMap?
- 16. là biến dễ bay hơi được đồng bộ hóa? (java)
- 17. Đa luồng so với Đa phiên bản - Lựa chọn nào?
- 18. Python: Khi nào nên sử dụng Chủ đề so với Đa xử lý
- 19. Làm cách nào để phát lại ứng dụng đa luồng?
- 20. Đa luồng, lambdas và biến cục bộ
- 21. Khi nào bạn nên sử dụng Page.DataBind() so với Control.DataBind()?
- 22. Khi nào/không sử dụng bộ điều hợp đồng bộ
- 23. Khi nào nên sử dụng Apache so với Apache + Tomcat?
- 24. Đồng thời và Đa luồng
- 25. Ngăn vòng lặp đồng bộ hóa mạng khi đồng bộ hóa từ mạng trong Android ContentProvider
- 26. Biến thể Java so với biến cục bộ
- 27. Dễ bay hơi khi được đồng bộ hóa với nhau
- 28. Đồng bộ hóa()/wait()/notifyAll() làm gì trong Java?
- 29. Java đồng bộ hóa trong mẫu đơn
- 30. Java: Sự cố đồng bộ hóa với NumberFormat?
http://stackoverflow.com/questions/3214938/java-volatile-modifier-and-synchronized-blocks và nhanh chóng goggling sẽ hiển thị nhiều thông tin –
trùng lặp? https://stackoverflow.com/questions/9851133/ –