12/08/2018, 18:22

Atomic và Nonatomic trong Objective- C

Sự khác biệt giữa thuộc tính atomic và nonatomic là một câu hỏi yêu thích của người phỏng vấn. Những từ khóa này xác định cách các thuộc tính hoạt động khi chúng được truy cập từ nhiều luồng cùng một lúc. 1. Atomic Atomic là cơ chế độc quyền, chỉ có một thread duy nhất được truy cập thuộc tính ...

Sự khác biệt giữa thuộc tính atomic và nonatomic là một câu hỏi yêu thích của người phỏng vấn. Những từ khóa này xác định cách các thuộc tính hoạt động khi chúng được truy cập từ nhiều luồng cùng một lúc.

1. Atomic

Atomic là cơ chế độc quyền, chỉ có một thread duy nhất được truy cập thuộc tính tại một thời điểm. Khi nhiều thread tham chiếu đến nó thì thread này thay đổi giá trị xong thì thread khác mới được quyền thay đổi, đảm bảo chỉ một thread được thay đổi giá trị ở một thời điểm. Vì vậy, atomic là an toàn.

Giả sử chúng ta có một thuộc tính firstName là atomic: Nó sẽ đảm bảo rằng giá trị của thuộc tính vẫn nhất quán trong suốt vòng đời. Trong iOS, default là atomic Ví dụ về thuộc tính atomic: Phương thức getter, setter: => Ưu điểm: luôn nhận được giá trị hợp lệ, an toàn => Nhược điểm: chậm, vì nó đảm bảm thread đã hoàn toàn hoàn thành.

2. Nonatomic

Thuộc tính nonatomic, nhiều thread truy cập cùng thời điểm có thể thay đổi thuộc tính, không có cơ chế nào để bảo vệ thuộc tính. Vì vậy thuộc tính nonatomic không an toàn.

Ví dụ: Phương thức getter, setter: => Ưu điểm: nhanh, vì không cần kiểm soát quyền truy cập của thread. => Nhược điểm: không an toàn, thuộc tính không được đảm bảo dù có nhận được giá trị hợp lệ hay không.

3. Tổng kết

Tóm lại, nonatomic truy xuất nhanh hơn, nếu đảm bảo biến nào đó chỉ chạy trên một thread nhất định ở một thời điểm nhất định thì dùng nonatomic để tốc độ nhanh hơn. Để biến được bảo vệ khi có nhiều thread cùng đọc/ ghi thì dùng atomic.

0