Nếu tôi muốn giữ một bộ đếm toàn cục (ví dụ: để đếm số lượng yêu cầu đến qua nhiều luồng), thì cách tốt nhất để làm trong java sẽ là sử dụng một int dễ bay hơi. Giả sử, clojure đang được sử dụng là có một cách tốt hơn (thông lượng tốt hơn) để làm gì?truy cập đồng bộ trong clojure
9
A
Trả lời
13
tôi sẽ làm điều này với một atom trong Clojure:
(def counter (atom 0N))
;; increment the counter
(swap! counter inc)
;; read the counter
@counter
=> 1
này là hoàn toàn thread-an toàn, và hiệu suất cao đáng ngạc nhiên. Ngoài ra, vì nó sử dụng xử lý số abitrary chính xác Clojure, nó không phải là dễ bị tràn số nguyên trong cách mà một int dễ bay hơi có thể .....
7
Xác định một bộ đếm toàn cầu như một agent
(def counter (agent 0))
để tăng giá trị chứa trong các đại lý bạn send
một chức năng (trong trường hợp này inc
) cho agent:
(send counter inc)
để đọc giá trị hiện tại bạn có thể sử dụng deref
hoặc @
macro trình đọc:
@counter ;; same as (deref counter)
Đại lý chỉ là một trong một số loại tham chiếu có sẵn. Bạn có thể đọc thêm về những điều này trên trang web Clojure:
Các vấn đề liên quan
- 1. Truy cập DLL không đồng bộ trong LabVIEW?
- 2. truy cập biến đồng thời trong c
- 3. Truy cập cơ sở dữ liệu đồng bộ và không đồng bộ
- 4. iOS - Truy cập đồng thời vào tài nguyên bộ nhớ
- 5. Truy cập đồng thời trong SQLite
- 6. Đồng bộ hóa đầu ra tiêu chuẩn trong Clojure
- 7. đồng thời truy cập file
- 8. Truy cập các trường Java tự động trong Clojure?
- 9. Bộ hẹn giờ trong clojure?
- 10. Clojure thành ngữ để đồng bộ giữa các chủ đề
- 11. Xử lý tin nhắn Clojure/không đồng bộ, đa luồng
- 12. File.WriteAllText và truy cập đồng thời
- 13. Truy cập tệp PHP và đồng thời
- 14. Truy cập bộ nhớ nhanh trong C++?
- 15. Bộ nhớ ngoài truy cập Android
- 16. Đồng bộ hóa quyền truy cập vào đối tượng Immutable Integer
- 17. Tôi làm cách nào để truy cập đồng bộ chỉ mụcDB?
- 18. Tê giác và truy cập đồng thời vào javax.script.ScriptEngine
- 19. Truy cập tệp được đồng bộ hóa trên đối tượng Java
- 20. Java: làm thế nào để đồng bộ hóa truy cập mảng và những hạn chế về những gì đi trong một điều kiện đồng bộ
- 21. Tại sao truy cập biến cục bộ nhanh hơn truy cập thành viên lớp trong Python?
- 22. Bản đồ có quyền truy cập đồng thời
- 23. 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
- 24. Truy cập hội đồng ký đã bị từ chối
- 25. Máy ảnh UIImagePicker và AVCaptureSession truy cập đồng thời
- 26. Thực hiện bộ đếm khách truy cập
- 27. Truy cập tệp cục bộ bằng NSURL
- 28. Truy cập bộ đệm luồng HttpWebRequest
- 29. Postback không đồng bộ và đồng bộ trong ASP.NET
- 30. Đồng bộ hóa cuộc gọi không đồng bộ trong C#
nó sẽ cung cấp thông lượng tốt hơn sau đó sử dụng một int không ổn định? nếu có, bất kỳ thông tin chi tiết nào về lý do/cách tốt hơn. – 142857
Một nguyên tử sẽ chậm hơn một chút so với int bay hơi. Nhưng trừ khi bạn đếm hàng triệu sự kiện mỗi giây, sự khác biệt sẽ không đủ lớn để nhận ra. Và ở mức thông lượng đó, một int dễ bay hơi sẽ tràn trong chưa đầy một giờ ...... – mikera
Trên Clojure 1.3, nó có thể tràn: '(hoán đổi! (Atom 9223372036854775807) inc)' ném một ngoại lệ tràn. Việc sửa chữa là sử dụng BigInts: '(hoán đổi! (Nguyên tử 9223372036854775807N) inc)' hoặc chức năng tự động quảng bá 'inc'' –