Was bedeutet @synchronized() tun, als eine singleton-Methode in objective C?
Ich gerade eine singleton-Methode, und ich würde gerne wissen, was die Funktion @synchronized()
tut, wie ich es Häufig, aber nicht wissen, die Bedeutung.
InformationsquelleAutor max_ | 2011-06-11
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es wird eine kritischen Abschnitt, um den code-block. In Multithread-code
@synchronized
garantiert, kann nur ein thread ausgeführt werden, der code in den block zu einem bestimmten Zeitpunkt.Wenn Sie nicht wissen, was es tut, dann ist Ihre Anwendung wahrscheinlich nicht multithreaded, und Sie wahrscheinlich nicht brauchen, es zu benutzen (vor allem, wenn der singleton selbst ist nicht thread-safe).
Edit: Hinzufügen einige weitere Informationen, die nicht in der ursprünglichen Antwort aus dem Jahr 2011.
Den
@synchronized
Richtlinie verhindert, dass mehrere threads von der Eingabe der region-code ist geschützt durch ein@synchronisiert
- Direktive beziehen sich auf dasselbe Objekt. Das Objekt, das an den@synchronized
Richtlinie ist das Objekt, das als "lock." Zwei threads werden in der gleichen geschützten Bereich des Codes, wenn ein anderes Objekt als das Schloss, und Sie kann auch Wache zwei völlig verschiedenen Regionen der code mit dem gleichen Objekt wie das Schloss.Auch, wenn Sie geschehen, passieren
nil
als lock-Objekt, keine Sperre alle.@synchronized
es tut nichts -- Sie sind ungesichert. 2)@synchronized
ist langsam.Diese Antwort ist irreführend, und sollte nicht die akzeptierte Antwort. Obwohl, was heißt es manchmal richtig sein (solange der token übergeben synhronized ist das gleiche Objekt in allen threads), ist es irreführend, unvollständig. synchronisiert verhindert, dass eine beliebige Anzahl von zugehörigen code-Abschnitte ausführen kann, die zur gleichen Zeit, nicht nur "den code in den block". Die parameter synchronisiert effektiv bestimmt, welche code-Abschnitte ("Blöcke", wie die Antwort, Sie nennt) sind geschützt, bei gleichzeitigem Zugriff.
Sie haben vollkommen Recht. Ich habe ein wenig mehr Informationen und einen link, um einige Apple-Dokumentation über
@synchronized
.die Antwort sieht jetzt viel besser. Daumen hoch von mir.
interessant zu diesem Punkt aus, aber wäre noch besser gewesen zu sagen kurz, was könnten die alternativen (links?)
InformationsquelleAutor John Calsbeek
Aus der Apple-Dokumentation hier und hier:
Die Dokumentation bietet eine fülle von Informationen zu diesem Thema. Es lohnt sich die Zeit und Lesen Sie es, insbesondere angesichts der Tatsache, dass Sie schon verwenden, ohne zu wissen, was es tut.
InformationsquelleAutor csano
Den
@synchronized
Richtlinie ist eine bequeme Möglichkeit zum erstellen mutex locks on-the-fly in Objective-C code.Den
@synchronized
Richtlinie tut, was alle anderen mutex-Sperre tun würde—es verhindert, dass andere threads vom Erwerb der gleichen Sperre in der gleichen Zeit.Syntax:
Beispiel:
Nun der obige code ist perfekt-thread sicher..Nun können Mehrere threads ändern Sie den Wert.
Das oben ist nur ein obskures Beispiel...
Oder sogar
@synchronized(val, oldValue) { ... }
?Ich bin mir nicht sicher, ob ich je gesehen habe, jede Regelung, dass war "der perfekte thread-safe". Zumindest müssen Sie wissen, was Sie tun und nicht einfach blind kopieren Sie den code von irgendwo.
Aber ich nehme an, der obige code ist "der perfekte thread-safe", nachdem alle, denn es bringt absolut nichts.
Sorry, aber ich bin nur erlaubt, downvote jede Antwort einmal.
InformationsquelleAutor Durai Amuthan.H
@synchronized-block verarbeitet automatisch sperren und entsperren für Sie. @synchronisieren
Sie haben eine implizite Sperre im Zusammenhang mit dem Objekt, das Sie verwenden, um zu synchronisieren. Hier ist eine sehr informative Diskussion zu diesem Thema Folgen Sie bitte Wie funktioniert @synchronisiert sperren/entsperren in Objective-C?
InformationsquelleAutor abdus.me
Ausgezeichnete Antwort hier:
Helfen, Verständnis Klasse Methode der Rückkehr singleton
weitere Erklärung für den Prozess der Erstellung eines singleton.
InformationsquelleAutor Matjan
@synchronized
istthread safe
Mechanismus. Stück code innerhalb dieser Funktion wird der Teil voncritical section
, das kann nur ein thread ausgeführt, eine Zeit.@synchronize
gilt die Sperre implizit in der Erwägung, dassNSLock
gilt es explizit.Es gewährleistet nur die thread-Sicherheit nicht garantiert. Was ich meine ist, Sie mieten Sie sich ein Experte Fahrer für Ihr Auto, noch ist es nicht garantiert Auto nicht einen Unfall haben. Aber die Wahrscheinlichkeit bleibt das geringste.
InformationsquelleAutor