2012-05-08 29 views
9
@property (atomic, retain) NSArray *array; 

Tôi không ghi đè lên trình thiết lập và bộ nạp của mảng. Tôi có thể sử dụng @synchronized (array) {} hoặc @synchronized (self.array) {}. Như tôi biết tất cả các trường hợp đều đúng, tôi có đúng không?Cách nào phù hợp để sử dụng @synchronized?

Trả lời

9

Khi bạn đã đặt câu hỏi, cả hai câu lệnh đều tương đương như một vấn đề về chiến lược an toàn đồng thời.

Tùy thuộc vào quy mô và khoảng cách bạn đã hoàn thành công việc trên dự án của mình, bạn có thể xem xét một chiến lược thay thế cho toàn bộ thread an toàn.

Gần đây, Apple đã đưa ra một điểm đề xuất chuỗi an toàn theo tuần tự hơn là chặn truyền thống. Tóm lại, khi sự tranh chấp tăng lên, truy cập được tuần tự hóa hiệu quả hơn nhiều so với việc chặn bằng @synchronize.

Thay vì đồng bộ hóa, hãy xem xét thiết lập hàng đợi nối tiếp GCD và xếp hàng truy cập vào các tài nguyên được chia sẻ qua các chuỗi.

+0

Hoặc, tốt hơn, hãy sử dụng mẫu trình ghi đọc, một hàng đợi đồng thời GCD, thực hiện các lần đọc với 'dispatch_sync' và viết với' dispatch_barrier_async'. – Rob

10

Sử dụng @syncrhonized(obj) chỉ cần tạo khóa để mã khác đồng bộ hóa trên obj sẽ không thực thi cùng một lúc.

Thuộc tính nguyên tử hoạt động bằng cách không cho phép thay đổi được thực hiện khi thuộc tính đang được truy cập; chúng cung cấp khóa ẩn để truy cập.

array = someObject.array; //locked 
[array doSomething];  //no longer locked 

Bạn không có thể ghi đè getter và setter cho atomic tài sản, nhưng sử dụng @sycnronized chỉ quanh getter/setter nên là đủ.

@synthesize array=_array; 

... 

-(void)setArray 
{ 
    @synchronized(self) 
    { 
     _array = array; 
    } 
} 

-(NSArray *)array 
{ 
    NSArray *retVal; 

    @synchronized(self) 
    { 
     retVal = _array; 
    } 

    return retVal; 
} 

Thành thật mà nói, trừ khi bạn đang thực hiện một số chương trình đa luồng nghiêm túc, các thuộc tính nguyên tử là không cần thiết và chỉ gây ra các lần truy cập hiệu suất.

+1

Rõ ràng, các ví dụ về getters và setters sử dụng '@ synchronized' là một cách xa khỏi luồng an toàn và do đó hầu như không bao giờ áp dụng mẫu này. Người ta thường phải thực hiện đồng bộ hóa ở mức cao hơn để nhận ra sự an toàn của luồng. – Rob

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