Ich habe gerade eine Singleton-Methode erstellt und möchte wissen, was die Funktion @synchronized()
tut, da ich sie häufig verwende, aber die Bedeutung nicht kenne.
Antworten:
Es deklariert einen kritischen Abschnitt um den Codeblock. @synchronized
Garantiert in Multithread-Code, dass jeweils nur ein Thread diesen Code im Block ausführen kann.
Wenn Sie nicht wissen, was es tut, ist Ihre Anwendung wahrscheinlich nicht multithreaded und Sie müssen sie wahrscheinlich nicht verwenden (insbesondere wenn der Singleton selbst nicht threadsicher ist).
Bearbeiten: Hinzufügen weiterer Informationen, die nicht in der ursprünglichen Antwort von 2011 enthalten waren.
Die @synchronized
Direktive verhindert, dass mehrere Threads in einen Codebereich eintreten, der durch eine @synchronized
Direktive geschützt ist , die auf dasselbe Objekt verweist . Das an die @synchronized
Direktive übergebene Objekt ist das Objekt, das als "Sperre" verwendet wird. Zwei Threads können sich in demselben geschützten Codebereich befinden, wenn ein anderes Objekt als Sperre verwendet wird, und Sie können auch zwei völlig unterschiedliche Codebereiche mit demselben Objekt wie die Sperre schützen.
Wenn Sie zufällig nil
als Sperrobjekt übergeben werden, wird überhaupt keine Sperre vorgenommen.
@synchronized
.
Aus der Apple-Dokumentation hier und hier :
Die @ synchronisierte Direktive ist eine bequeme Möglichkeit, Mutex-Sperren im laufenden Betrieb in Objective-C-Code zu erstellen. Die @ synchronisierte Direktive macht das, was jede andere Mutex-Sperre tun würde - sie verhindert, dass verschiedene Threads gleichzeitig dieselbe Sperre erhalten.
Die Dokumentation bietet eine Fülle von Informationen zu diesem Thema. Es lohnt sich, sich die Zeit zu nehmen, um es durchzulesen, insbesondere angesichts der Tatsache, dass Sie es verwendet haben, ohne zu wissen, was es tut.
Die @synchronized
Direktive ist eine bequeme Möglichkeit, Mutex-Sperren im laufenden Betrieb in Objective-C- Code zu erstellen .
Die @synchronized
Direktive macht das, was jede andere Mutex-Sperre tun würde - sie verhindert, dass verschiedene Threads gleichzeitig dieselbe Sperre erhalten.
Syntax:
@synchronized(key)
{
// thread-safe code
}
Beispiel:
-(void)AppendExisting:(NSString*)val
{
@synchronized (oldValue) {
[oldValue stringByAppendingFormat:@"-%@",val];
}
}
Jetzt ist der obige Code vollkommen threadsicher. Jetzt können mehrere Threads den Wert ändern.
Das Obige ist nur ein obskures Beispiel ...
@synchronized(val, oldValue) { ... }
?
@synchronized block übernimmt automatisch das Sperren und Entsperren für Sie . @synchronize Sie haben eine implizite Sperre für das Objekt, das Sie zum Synchronisieren verwenden. Hier finden Sie eine sehr informative Diskussion zu diesem Thema. Folgen Sie bitte Wie wird @synchronized in Objective-C gesperrt / entsperrt?
Hervorragende Antwort hier:
Hilfe zum Verständnis der Klassenmethode, die Singleton zurückgibt
mit weiteren Erläuterungen zum Erstellen eines Singletons.
@synchronized
ist thread safe
Mechanismus. Der in diese Funktion geschriebene Code wird zu dem Teil critical section
, für den jeweils nur ein Thread ausgeführt werden kann.
@synchronize
Wendet die Sperre implizit an, während NSLock
sie explizit angewendet wird.
Es gewährleistet nur die Gewindesicherheit, garantiert dies jedoch nicht. Was ich meine ist, dass Sie einen erfahrenen Fahrer für Ihr Auto einstellen, aber es garantiert nicht, dass das Auto keinen Unfall erleidet. Die Wahrscheinlichkeit bleibt jedoch am geringsten.
@synchronized
, geschieht nichts - Sie bleiben ungeschützt. 2)@synchronized
ist langsam .