2009-08-01 23 views
6

Tôi có thể thực hiện bất kỳ thao tác nào sau đây không? Họ sẽ khóa/mở khóa đúng đối tượng? Tại sao hay tại sao không? Giả sử có nhiều chủ đề giống hệt nhau sử dụng biến toàn cầu "obj", được khởi tạo trước khi tất cả các chủ đề bắt đầu.Thay đổi đối tượng khóa bên trong phần @synchronized

1.

@synchronized(obj) { 
    [obj release]; 
    obj = nil; 
} 

2.

@synchronized(obj) { 
    obj = [[NSObject new] autorelease]; 
} 
+0

Lưu ý: Liên quan đến http://stackoverflow.com/questions/1215330/ –

+1

Sau khi đọc bài đăng SO này, tôi quyết định điều tra @synchronized kỹ lưỡng hơn một chút và viết bài đăng blog lên đó. Bạn có thể thấy nó hữu ích: http://rykap.com/objective-c/2015/05/09/synchronized.html – rjkaplan

+0

@rjkaplan liên kết của bạn bị hỏng –

Trả lời

8

Câu trả lời ngắn: không, họ sẽ không đúng khóa/mở khóa, và cách tiếp cận như vậy cần phải tránh.

Câu hỏi đầu tiên của tôi là lý do tại sao bạn muốn làm điều gì đó như thế này, vì các phương pháp này vô hiệu hóa mục đích và lợi ích của việc sử dụng khối @synchronized ngay từ đầu.

Trong ví dụ thứ hai, khi chuỗi thay đổi giá trị obj, mọi chuỗi tiếp theo đến khối @synchronized sẽ đồng bộ hóa trên đối tượng mới, không phải đối tượng ban đầu. Đối với các luồng N, bạn sẽ tạo một cách rõ ràng các đối tượng tự động phát hiện N và thời gian chạy có thể tạo tối đa N khóa đệ quy kết hợp với các đối tượng đó. Hoán đổi đối tượng mà bạn đồng bộ hóa trong phần quan trọng là một sự không đồng bộ cơ bản của đồng thời thread-safe. Đừng làm thế. Không bao giờ. Nếu nhiều chủ đề có thể truy cập một cách an toàn một khối đồng thời, chỉ cần bỏ qua toàn bộ @synchronized.

Trong ví dụ đầu tiên của bạn, kết quả có thể không xác định và chắc chắn không phải những gì bạn muốn. Nếu thời gian chạy chỉ sử dụng con trỏ đối tượng để tìm khóa được liên kết, mã có thể chạy tốt, nhưng đồng bộ hóa trên nil không có hiệu quả trong các thử nghiệm đơn giản của tôi, vì vậy bạn đang sử dụng @synchronized một cách vô nghĩa, vì nó không cung cấp bảo vệ bất cứ điều gì.

Tôi thành thật không cố gắng khắc nghiệt, vì tôi đoán bạn có lẽ chỉ tò mò về cấu trúc. Tôi chỉ từ ngữ này mạnh mẽ để (hy vọng) ngăn cản bạn và những người khác viết mã mà là thiếu sót nghiêm trọng, đặc biệt là nếu theo giả định rằng nó đồng bộ đúng cách. Chúc may mắn!

+0

Trong trường hợp cụ thể của tôi (lý do tôi tìm thấy điều này Q/A) là tôi muốn làm một cái gì đó như (xin lỗi, không có định dạng tốt trong ý kiến) ... '@synchornized (obj) {if (obj! = Nil) {... [làm công cụ, snip]; obj = nil}} '(* LƯU Ý: * Tôi đang ở dưới ARC, vì vậy tôi nhận được' bản phát hành 'miễn phí. Điều tôi muốn là, nếu có một obj, để đồng bộ nó trong khi tôi lộn xộn xung quanh. Nếu không, tôi không thực sự quan tâm. – Olie

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