AtomicInteger có xử lý đồng bộ hóa không?

Aug 17 2020

Nếu cả hai luồng đều tăng như nhau int ibằng cách sử dụng i ++ , chúng ta có thể gặp sự cố, vì i ++ không phải là hoạt động nguyên tử. Đó là lý do tại sao có AtomicInteger.increment(), làm cho nguyên tử tăng dần. Vì vậy, nếu chúng tôi có 1 lõi và 2 luồng hoạt động .increment(), có thể hoàn toàn không có vấn đề gì (vì nó không thể bị treo giữa chừng).

Nhưng điều gì sẽ xảy ra nếu chúng ta có 2 lõi và 2 luồng và chúng song song (chính xác cùng một lúc) gọi như increment()vậy?

Có thể có khả năng rằng họ tải cùng một giá trị int i? Có nghĩa int ilà nếu là 1 , kết quả cuối cùng sẽ là 2 chứ không phải 3 . Trong trường hợp đó, chúng tôi không quan tâm đó có phải là hoạt động nguyên tử hay không vì cả hai đều nhận cùng một giá trị cùng một lúc ..

Điểm mấu chốt: Đồng bộ hóa có được xử lý bởi AtomicInteger không?

Trả lời

3 Joni Aug 17 2020 at 12:04

Có thể có khả năng rằng họ tải cùng một giá trị int i?

Có, có, nhưng nó được xử lý cho bạn.

Các incrementAndGetphương pháp sử dụng một nguyên tử "so sánh và set" hoạt động mà bộ giá trị tăng lên nhưng chỉ khi một giá trị mới không được đã được thiết lập . Nếu so sánh không thành công, hãy incrementAndGettìm nạp giá trị mới và thử lại.

Hiệu ứng ròng là, nó là an toàn để sử dụng incrementAndGettừ nhiều chủ đề.