Trong Objective-C, bạn có sự phân biệt giữa các tính chất nguyên tử và không giải phẫu:
@property (nonatomic, strong) NSObject *nonatomicObject;
@property (atomic, strong) NSObject *atomicObject;
Theo hiểu biết của tôi, bạn có thể đọc và ghi các thuộc tính được định nghĩa là nguyên tử từ nhiều luồng một cách an toàn, trong khi việc viết và truy cập các thuộc tính phi giải phẫu hoặc ivars từ nhiều luồng cùng một lúc có thể dẫn đến hành vi không xác định, bao gồm cả lỗi truy cập xấu.
Vì vậy, nếu bạn có một biến như thế này trong Swift:
var object: NSObject
Tôi có thể đọc và ghi song song biến này một cách an toàn không? (Mà không cần xem xét ý nghĩa thực tế của việc làm này).
atomic
thường không được coi là đủ để tương tác an toàn theo luồng với một thuộc tính, ngoại trừ các kiểu dữ liệu đơn giản. Đối với các đối tượng, người ta thường đồng bộ hóa quyền truy cập qua các luồng bằng cách sử dụng khóa (ví dụ: NSLock
hoặc @synchronized
) hoặc hàng đợi GCD (ví dụ: hàng đợi nối tiếp hoặc hàng đợi đồng thời với mẫu "trình đọc-ghi").
atomic
không đảm bảo an toàn luồng cho các đối tượng; và (b) nếu người ta sử dụng đúng một trong các kỹ thuật đồng bộ hóa nói trên để đảm bảo an toàn luồng (trong số những thứ khác, ngăn việc đọc / ghi đồng thời), thì vấn đề nguyên tử sẽ được tranh luận. Nhưng chúng ta vẫn cần / muốn nó cho các kiểu dữ liệu đơn giản, nơi atomic
có giá trị thực. Câu hỏi hay!
@atomic
hoặc@nonatomic
. hoặc chỉ nguyên tử theo mặc định. (Swift là rất không đầy đủ, chúng tôi không thể nói nhiều bây giờ)