2011-10-04 31 views
24

Tôi sử dụng số nguyên làm bộ đếm. Số nguyên sẽ chỉ được tăng lên, và chắc chắn nhiều hơn một sợi sẽ tăng cùng một lúc. Giá trị của bộ đếm này được đọc vào cuối chương trình thực thi chương trình khi không có chuỗi nào khác cố gắng truy cập giá trị của nó.Cần đồng bộ hóa cho bộ đếm chỉ tăng?

Tôi giả sử rằng tôi không phải sử dụng khóa hoặc bất kỳ loại đồng bộ hóa nào cho loại bộ đếm chỉ tăng này. Thê nay đung không? Tôi viết mã bằng Java nếu điều đó tạo ra bất kỳ sự khác biệt nào.

Trả lời

59

Nếu bạn chỉ sử dụng một int hay long biến sau đó bạn sẽ cần đồng bộ hóa - incrementing liên quan đến việc đọc/increment-địa phương/viết, đó là xa một hoạt động nguyên tử. (Thậm chí nếu biến là volatile để tránh những lo ngại mô hình bộ nhớ của staleness, bạn vẫn muốn có ba hoạt động riêng biệt, với khả năng bị trước empted giữa bất kỳ cặp trong số họ.)

May mắn thay Java cung cấp AtomicIntegerAtomicLongthể được sử dụng mà không cần bất kỳ đồng bộ hóa:

private final AtomicLong counter = new AtomicLong(); 

... 

counter.incrementAndGet(); // No need for synchronization 
+0

Như thường lệ, một câu trả lời tuyệt vời bởi Jon Skeet. Jon bạn đã viết bất kỳ cuốn sách nào về lập trình Java, nếu vậy hãy cho tôi biết :) Đề xuất các sách khác cũng sẽ được đánh giá cao – JavaSa

+5

@JavaSa: Không, tôi chưa viết gì trên Java. Tôi khuyên bạn nên sử dụng hiệu quả Java bởi Josh Bloch. –

+0

Cảm ơn, bạn cũng có đề xuất sách miễn phí để đề cập đến các tính năng mới đã có trong Java kể từ năm 2005? Cho phép nói cho java 7 và có thể Java 8 – JavaSa

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