Giả sử bạn đang cố gắng đồng bộ hóa tương tác với đối tượng myID
này trong hàng đợi nền, bạn muốn nó theo cách khác xung quanh, khóa bên trong khối được gửi đi. Ngay bây giờ bạn có:
@synchronized(myID) {
dispatch_async(queue, ^{
// do stuff with myID
});
}
Đó là đồng bộ hóa quá trình thêm khối cử đến hàng đợi của bạn, nhưng không không đồng bộ hóa những gì bạn đang làm trong nền. Tôi nghi ngờ đó không phải là ý của bạn.
Bạn có dự định:
dispatch_async(queue, ^{
@synchronized(myID) {
// do stuff with myID
}
});
Nó trông rất giống nhau, nhưng kết quả trong một hành vi hoàn toàn khác nhau. Bây giờ, công việc được gửi đến hàng đợi nền đang được đồng bộ hóa.
Là một tinh tế hơn nữa, nếu điều này cử khối có thể là chậm (và tôi cho rằng nó có thể được), sau đó bạn có thể muốn hạn chế @synchronized
khối càng nhiều càng tốt:
dispatch_async(queue, ^{
// do slow stuff in preparation for interacting with `myID`
@synchronized(myID) {
// quickly do stuff with myID
}
// do anything else here
});
Nếu bạn làm tất cả các khối nền trong một khối @synchronized
, bạn có thể đánh bại toàn bộ mục đích để gửi nó đến nền, cụ thể là để giảm thiểu tác động lên hàng đợi chính. Buổi biểu diễn cuối cùng này giảm nhẹ vấn đề đó. Theo quan sát cuối cùng, nếu bạn có hàng đợi nối tiếp (hoặc hàng đợi đồng thời không phải là toàn cầu mà bạn cập nhật bằng một rào chắn), nó thường được sử dụng như một kỹ thuật giúp loại bỏ hoàn toàn nhu cầu về khóa, miễn là tất cả các cập nhật và yêu cầu cho myID
được gửi đến hàng đợi đó. Xem Eliminating Lock-Based Code trong Hướng dẫn lập trình đồng thời .
Bạn đang cố gắng đạt được điều gì? – Wain
BTW, tôi có đúng với giả định rằng bạn đang _không phục hồi 'myID' tại bất kỳ thời điểm nào không? Khối '@ synchronized' là duy nhất cho cá thể cụ thể của đối tượng được trỏ đến bởi' myID', không phải là biến nói chung. – Rob