ich quer durch das auf dem Mike Ash „Pflege und Fütterung von Singletons“ kam und war ein wenig von seinem Kommentar puzzeled:Mike Ash Singleton: Platzierung @synchronized
Dieser Code ist etwas langsam, aber. Eine Sperre ist etwas teuer. Making es schmerzhafter ist die Tatsache , dass die überwiegende Mehrheit der Zeit, das Schloss ist sinnlos. Die Sperre wird nur benötigt, wenn foo null ist, was grundsätzlich nur einmal passiert. Nachdem der Singleton initialisiert wurde, ist die Notwendigkeit für das Schloss weg, aber das Schloss selbst bleibt .
+(id)sharedFoo {
static Foo *foo = nil;
@synchronized([Foo class]) {
if(!foo) foo = [[self alloc] init];
}
return foo;
}
Meine Frage ist, und es besteht kein Zweifel ein guter Grund dafür, aber warum können Sie nicht schreiben (siehe unten), um die Sperre zu begrenzen, wenn foo ist gleich Null?
+(id)sharedFoo {
static Foo *foo = nil;
if(!foo) {
@synchronized([Foo class]) {
foo = [[self alloc] init];
}
}
return foo;
}
prost gary
Ah ok, so dass im Grunde brauchen Sie einen Scheck in dem @synchronize Block? – fuzzygoat
Das ist der springende Punkt von @synchronized: Erlaube jeweils einem Thread die Überprüfung. –
Versuchen Sie stattdessen dispatch_once(): http://StackOverflow.com/q/5720029/290295 – ctpenrose