tôi đến accross này trên Mike Ash "Chăm sóc và nuôi dưỡng độc thân" và là một chút puzzeled bởi lời nhận xét của mình:Mike Ash Singleton: Đổ @synchronized
Mã này là loại chậm, mặc dù. Lấy khóa có phần đắt tiền. Làm cho nó đau đớn hơn là sự kiện rằng phần lớn thời gian, khóa là vô nghĩa. Khóa là chỉ cần thiết khi foo là không, trong đó về cơ bản chỉ xảy ra một lần. Sau khi singlet được khởi tạo, cần có khóa đã biến mất, nhưng bản thân khóa vẫn còn.
+(id)sharedFoo {
static Foo *foo = nil;
@synchronized([Foo class]) {
if(!foo) foo = [[self alloc] init];
}
return foo;
}
Câu hỏi của tôi là, và không có nghi ngờ một lý do chính đáng cho điều này nhưng tại sao bạn không thể viết (xem bên dưới) để hạn chế khóa để khi foo là con số không?
+(id)sharedFoo {
static Foo *foo = nil;
if(!foo) {
@synchronized([Foo class]) {
foo = [[self alloc] init];
}
}
return foo;
}
cổ vũ gary
Ah ok, vì vậy về cơ bản bạn cần kiểm tra bên trong khối @synchronize? – fuzzygoat
Đó là toàn bộ điểm của @synchronized: Cho phép một luồng tại một thời điểm để thực hiện kiểm tra. –
Hãy thử dispatch_once() để thay thế: http://stackoverflow.com/q/5720029/290295 – ctpenrose