2013-04-17 21 views
5

Có thể một câu hỏi ngu ngốc để hỏi nhưng tôi cần một số xác nhận về nó.Nghi ngờ về sự tương tranh với các đối tượng có thể được sử dụng nhiều lần như các trình định dạng

Thông thường, khi tôi xử lý các đối tượng có thể được sử dụng nhiều lần trong ứng dụng của tôi, tôi sử dụng cách tiếp cận như sau.

Tạo tiện ích mở rộng, ví dụ: NSDecimalNumber+Extension hoặc tiện ích lớp nơi trình định dạng số được tạo như sau.

+ (NSNumberFormatter*)internal_sharedNumberFormatter 
{ 
    static NSNumberFormatter* _internal_numberFormatter = nil; 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
     _internal_numberFormatter = [[NSNumberFormatter alloc] init]; 
     // other configurations here... 
    }); 

    return _internal_numberFormatter; 
} 

+ (NSString*)stringRepresentationOfDecimalNumber:(NSDecimalNumber*)numberToFormat 
{ 
    NSString *stringRepresentation = [[self class] internal_sharedNumberFormatter] stringFromNumber:numberToFormat]; 
    return stringRepresentation; 
} 

Cách tiếp cận này khá tốt vì ví dụ, các trình định dạng tốn kém để tạo. Nhưng nó cũng có thể được áp dụng cho các tình huống khác.

Bây giờ, câu hỏi của tôi là như sau.

Cách tiếp cận này cũng có hợp lệ trong các trường hợp có đường dẫn thực hiện khác nhau (các chuỗi khác nhau) có liên quan không?

Vì vậy, nếu tôi gọi đầu tiên là stringRepresentationOfDecimalNumber trên luồng chính và sau đó trong một chủ đề khác, điều gì có thể xảy ra?

Tôi nghĩ là hợp lệ để thực hiện các cuộc gọi khác nhau đến stringRepresentationOfDecimalNumber trong các chuỗi khác nhau kể từ khi trình chia sẻ được chia sẻ, trong trường hợp này, chỉ đọc, nhưng tôi muốn nhận được trả lời từ các chuyên gia.

Xin cảm ơn trước.

+0

có thể trùng lặp của [Suy nghĩ trong việc truy cập chỉ đọc các đối tượng từ các chủ đề khác nhau] (http://stackoverflow.com/questions/19960287/thoughts-in-accessing-read-only-objects-from-different-threads) –

Trả lời

2

NSNumberFormatter có thể thay đổi, do đó, thường không phải là chủ đề an toàn và được trích dẫn trong Thread Safety Summary (xem phần "Chủ đề không an toàn") trong danh sách lớp an toàn không phải là chủ đề.

Nhưng nếu bạn coi đối tượng của mình là đối tượng không thay đổi, bạn không phải lo lắng về điều kiện chủng tộc. Vì vậy, ví dụ, bạn không thể thay đổi định dạng nếu có nhiều luồng truy cập vào trình định dạng. Nếu _internal_numberFormatter không bị thay đổi theo bất kỳ cách nào và bạn chỉ có hai phương thức này trong danh mục, bạn nên xem xét chuỗi đó an toàn.

+0

Cảm ơn trả lời của bạn. +1. Tôi sẽ đợi các trả lời khác trong một thời gian trước khi đánh dấu bạn là chính xác. Cảm ơn. –

+0

Tôi đã tạo một câu hỏi mới trên đó. http://stackoverflow.com/questions/19960287/thoughts-in-accessing-read-only-objects-from-different-threads. Đây là câu trả lời chính xác. Chúc mừng. –

+0

Vì vậy, hãy suy nghĩ để xóa câu trả lời của bạn là không chính xác. Cảm ơn. –

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