Có, chỉ thị @synchronized
là reentrant. Xem Using the @synchronized Directive trong Hướng dẫn lập trình luồng và cũng có Threading bằng Ngôn ngữ lập trình ObjC.
Điều đó nói rằng, bạn hầu như không bao giờ nên sử dụng tính năng này trong iOS. Trong hầu hết các trường hợp, bạn có thể tránh các ổ khóa của tất cả các loại, hãy để một mình rất nặng (chậm) ổ khóa như ổ khóa reentrant. Xem Hướng dẫn lập trình đồng thời, và đặc biệt là phần Migrating Away from Threads, để biết thông tin mở rộng các phương pháp dựa trên hàng đợi mà iOS ưu tiên hơn việc quản lý và khóa luồng thủ công.
Ví dụ, khóa đọc/ghi các công trình như thế này sử dụng Grand Central Dispatch:
- (id)init {
...
_someObjectQueue = dispatch_queue_create("com.myapp.someObject",
DISPATCH_QUEUE_CONCURRENT);
}
// In iOS 5 you need to release disptach_release(_someObjectQueue) in dealloc,
// but not in iOS 6.
- (id)someObject {
__block id result;
dispatch_sync(self.someObjectQueue, ^{
result = _someObject;
});
return result;
}
- (void)setSomeObject:(id)newValue {
dispatch_barrier_async(self.queue, ^{
_someObject = newValue;
});
Cách tiếp cận này cho phép người đọc song song không giới hạn, với nhà văn độc đáo, đồng thời đảm bảo rằng nhà văn không bao giờ bỏ đói và việc ghi và đọc được serialized, tất cả trong khi tránh bất kỳ cuộc gọi hạt nhân trừ khi có sự tranh chấp thực tế. Đó là tất cả để nói nó rất nhanh và đơn giản.
Khi trình đọc xuất hiện, bạn xếp hàng yêu cầu đọc giá trị và đợi yêu cầu xử lý. Khi một người viết đến, nó xếp hàng một yêu cầu rào cản để cập nhật nó, yêu cầu không có yêu cầu nào khác từ hàng đợi đó hiện đang chạy. Với cấu trúc này, nhà phát triển không cần quản lý bất kỳ khóa nào. Chỉ cần đặt mọi thứ vào hàng đợi theo thứ tự bạn muốn chúng chạy.
Nguồn
2012-10-07 19:58:00
'@ synchronized' là người tham gia lại nhưng không hỗ trợ nhiều người đọc. GCD sẽ yêu cầu tái cơ cấu đáng kể mã hiện tại của tôi. – Askable
Bạn đúng là @synchronized không hỗ trợ nhiều người đọc. Cách tiếp cận này là không bình thường trong Cocoa, và tôi không quen thuộc với một giải pháp tuyệt vời cho nó vượt ra ngoài pthread_rwlock_init mà tôi nhớ là không reentrant. Loại khóa này, như tôi đã nói, là rất kém hiệu quả, và iOS và Mac hiện đại có cơ chế nhanh hơn, an toàn hơn và đơn giản hơn trong GCD và NSOperationQueue. Trong Mac cũ, đa nhiệm hợp tác (runloop) được ưu tiên mạnh mẽ. .NET thừa kế tình yêu của nó về các chủ đề và khóa từ Java. ObjC không khuyến khích luồng rõ ràng. Ca cao không giống như .NET và nó là giá trị học cách tiếp cận Cocoa trong iOS. –
(Vâng; tôi biết điều này không thực sự trả lời câu hỏi của bạn. Xin lỗi về điều đó.) –