Was bedeutet atomic
und nonatomic
bedeutet in Eigentumserklärungen?
@property(nonatomic, retain) UITextField *userName;
@property(atomic, retain) UITextField *userName;
@property(retain) UITextField *userName;
Was ist der betriebliche Unterschied zwischen diesen drei?
ios
objective-c
properties
atomic
nonatomic
Alex Wayne
quelle
quelle
Antworten:
Die letzten beiden sind identisch; "atomic" ist das Standardverhalten (
beachten Sie, dass es sich nicht um ein Schlüsselwort handelt; es wird nur durch das Fehlen von-nonatomic
angegeben, dasatomic
in neueren Versionen von llvm / clang als Schlüsselwort hinzugefügt wurde).Unter der Annahme, dass Sie die Methodenimplementierungen @synthesisieren, ändert Atomic vs. Non-Atomic den generierten Code. Wenn Sie Ihren eigenen Setter / Getter schreiben, sind Atomic / Nonatomic / Retain / Assign / Copy nur ratsam. (Hinweis: @synthesize ist jetzt das Standardverhalten in neueren Versionen von LLVM. Es ist auch nicht erforderlich, Instanzvariablen zu deklarieren. Sie werden ebenfalls automatisch synthetisiert und
_
ihrem Namen vorangestellt, um einen versehentlichen direkten Zugriff zu verhindern.)Mit "atomar" stellt der synthetisierte Setter / Getter sicher, dass immer ein ganzer Wert vom Getter zurückgegeben oder vom Setter gesetzt wird, unabhängig von der Setteraktivität in einem anderen Thread. Das heißt, wenn sich Thread A in der Mitte des Getters befindet, während Thread B den Setter aufruft, wird ein tatsächlich realisierbarer Wert - höchstwahrscheinlich ein automatisch freigegebenes Objekt - an den Aufrufer in A zurückgegeben.
In
nonatomic
werden keine solchen Garantien gegeben. Somitnonatomic
ist erheblich schneller als "atomar".Was "atomar" nicht tut, ist, irgendwelche Garantien über die Gewindesicherheit zu geben. Wenn Thread A den Getter gleichzeitig mit Thread B und C aufruft, die den Setter mit unterschiedlichen Werten aufrufen, kann Thread A einen der drei zurückgegebenen Werte erhalten - den vor dem Aufrufen von Setzern oder einen der an die Setter übergebenen Werte in B und C. Ebenso kann das Objekt mit dem Wert von B oder C enden, keine Möglichkeit zu sagen.
Die Gewährleistung der Datenintegrität - eine der Hauptherausforderungen der Multithread-Programmierung - wird auf andere Weise erreicht.
Hinzu kommt:
atomicity
einer einzelnen Eigenschaft kann auch keine Thread-Sicherheit garantieren, wenn mehrere abhängige Eigenschaften im Spiel sind.Erwägen:
In diesem Fall könnte Thread A das Objekt durch Aufrufen
setFirstName:
und anschließendes Aufrufen umbenennensetLastName:
. In der Zwischenzeit kann Thread BfullName
zwischen den beiden Aufrufen von Thread A aufrufen und erhält den neuen Vornamen in Verbindung mit dem alten Nachnamen.Um dies zu beheben, benötigen Sie ein Transaktionsmodell . Dh eine andere Art der Synchronisation und / oder des Ausschlusses, mit der der Zugriff ausgeschlossen werden kann,
fullName
während die abhängigen Eigenschaften aktualisiert werden.quelle
@property NSArray* astronomicalEvents;
, das Daten auflistet, die ich in der Benutzeroberfläche anzeigen möchte. Wenn die Anwendung startet und der Zeiger auf ein leeres Array zeigt, ruft die App Daten aus dem Web ab. Wenn die Webanforderung abgeschlossen ist (in einem anderen Thread), erstellt die App ein neues Array und setzt die Eigenschaft atomar auf einen neuen Zeigerwert. Es ist threadsicher und ich musste keinen Sperrcode schreiben, es sei denn, mir fehlt etwas. Scheint mir ziemlich nützlich zu sein.atomic
verhindert Cross-Thread-Halbwertlesungen. (Das war ein lustiger Fehler zu finden.)retain/autorelease
Tanz zurück. Thread B gibt das Objekt frei. Faden A boomt .atomic
stellt sicher, dass Thread A eine starke Referenz (eine Anzahl von +1 beibehalten) für den Rückgabewert hat.Dies wird in der Apple- Dokumentation erläutert. Nachfolgend finden Sie einige Beispiele dafür, was tatsächlich passiert.
Beachten Sie, dass es kein "atomares" Schlüsselwort gibt. Wenn Sie nicht "nichtatomar" angeben, ist die Eigenschaft atomar, aber die explizite Angabe von "atomar" führt zu einem Fehler.Wenn Sie nicht "nichtatomar" angeben, ist die Eigenschaft atomar, Sie können jedoch in neueren Versionen explizit "atomar" angeben, wenn Sie möchten.
Jetzt ist die atomare Variante etwas komplizierter:
Grundsätzlich muss die atomare Version gesperrt werden, um die Thread-Sicherheit zu gewährleisten, und erhöht auch die Ref-Anzahl für das Objekt (und die Anzahl der Autoreleases, um es auszugleichen), damit das Objekt für den Aufrufer garantiert existiert, andernfalls dort Dies ist eine mögliche Race-Bedingung, wenn ein anderer Thread den Wert festlegt und die Ref-Anzahl auf 0 fällt.
Es gibt tatsächlich eine große Anzahl verschiedener Varianten, wie diese Dinge funktionieren, abhängig davon, ob die Eigenschaften skalare Werte oder Objekte sind und wie beibehalten, kopieren, schreibgeschützt, nichtatomar usw. interagieren. Im Allgemeinen wissen die Eigenschaftssynthesizer nur, wie man für alle Kombinationen das "Richtige" macht.
quelle
@property (assign) id delegate;
wird auf nichts synchronisiert (iOS SDK GCC 4.2 ARM-Os
), was bedeutet, dass es einen Wettlauf zwischen[self.delegate delegateMethod:self];
und gibtfoo.delegate = nil; self.foo = nil; [super dealloc];
. Siehe stackoverflow.com/questions/917884/…_val
/val
sind, aber nein, nicht wirklich. Der Getter für ein Atomcopy
/ eineretain
Eigenschaft muss sicherstellen, dass er kein Objekt zurückgibt, dessen Refcount Null wird, da der Setter in einem anderen Thread aufgerufen wird. Dies bedeutet im Wesentlichen, dass er den ivar lesen und beibehalten muss, während er sicherstellt, dass der Setter dies nicht getan hat überschrieben und freigegeben, und dann automatisch freigeben, um die Aufbewahrung auszugleichen. Dies bedeutet im Wesentlichen, dass sowohl der Getter als auch der Setter eine Sperre verwenden müssen (wenn das Speicherlayout festgelegt wurde, sollte dies mit CAS2-Anweisungen möglich sein; leider-retain
handelt es sich um einen Methodenaufruf).Atomic
Nicht atomar
quelle
Der beste Weg, um den Unterschied zu verstehen, ist das folgende Beispiel.
Angenommen, es gibt eine atomare Zeichenfolgeeigenschaft mit dem Namen "name". Wenn Sie
[self setName:@"A"]
von Thread A,[self setName:@"B"]
von Thread B und[self name]
von Thread C aufrufen , werden alle Operationen an verschiedenen Threads seriell ausgeführt. Dies bedeutet, dass ein Thread einen Setter ausführt oder Getter, dann warten andere Threads.Dies macht das Lesen / Schreiben der Eigenschaft "Name" sicher, aber wenn ein anderer Thread, D,
[name release]
gleichzeitig aufruft, kann diese Operation einen Absturz verursachen, da hier kein Setter / Getter-Aufruf beteiligt ist. Dies bedeutet, dass ein Objekt schreib- / schreibsicher (ATOMIC) ist, jedoch nicht threadsicher, da andere Threads gleichzeitig alle Arten von Nachrichten an das Objekt senden können. Der Entwickler sollte die Thread-Sicherheit für solche Objekte gewährleisten.Wenn die Eigenschaft "Name" nichtatomar war, werden alle Threads im obigen Beispiel - A, B, C und D gleichzeitig ausgeführt und erzeugen ein unvorhersehbares Ergebnis. Im Fall von Atomic wird entweder eines von A, B oder C zuerst ausgeführt, aber D kann immer noch parallel ausgeführt werden.
quelle
Die Syntax und Semantik sind bereits durch andere hervorragende Antworten auf diese Frage gut definiert. Da Ausführung und Leistung nicht gut detailliert sind, werde ich meine Antwort hinzufügen.
Ich hatte Atomic immer als Standard angesehen, ziemlich neugierig. Auf der Abstraktionsebene, auf der wir arbeiten, ist die Verwendung atomarer Eigenschaften für eine Klasse als Vehikel zur Erzielung einer 100% igen Thread-Sicherheit ein Eckfall. Für wirklich korrekte Multithread-Programme ist mit ziemlicher Sicherheit ein Eingreifen des Programmierers erforderlich. In der Zwischenzeit wurden Leistungsmerkmale und Ausführung noch nicht detailliert beschrieben. Nachdem ich im Laufe der Jahre einige stark multithreaded Programme geschrieben hatte, hatte ich meine Eigenschaften als
nonatomic
die ganze Zeit deklariert, weil Atomic für keinen Zweck sinnvoll war. Während der Diskussion der Details der atomaren und nichtatomaren Eigenschaften dieser Frage stieß ich bei einigen Profilen auf einige merkwürdige Ergebnisse.Ausführung
OK. Als erstes möchte ich klarstellen, dass die Sperrimplementierung implementierungsdefiniert und abstrahiert ist. Louis verwendet
@synchronized(self)
in seinem Beispiel - ich habe dies als eine häufige Quelle der Verwirrung gesehen. Die Implementierung ist nicht tatsächlich verwenden@synchronized(self)
; Es werden Spin-Sperren auf Objektebene verwendet . Louis 'Illustration ist gut für eine hochrangige Illustration mit Konstrukten, mit denen wir alle vertraut sind, aber es ist wichtig zu wissen, dass sie nicht verwendet wird@synchronized(self)
.Ein weiterer Unterschied besteht darin, dass die atomaren Eigenschaften Ihre Objekte im Getter beibehalten / freigeben.
Performance
Hier ist der interessante Teil: Die Leistung bei der Verwendung von atomaren Eigenschaftszugriffen in unbestrittenen Fällen (z. B. Single-Threaded-Fällen) kann in einigen Fällen sehr schnell sein. In weniger als idealen Fällen kann die Verwendung von atomaren Zugriffen mehr als das 20-fache des Overheads kosten
nonatomic
. Während der umstrittene Fall mit 7 Threads für die Drei-Byte-Struktur (2,2 GHz Core i7 Quad Core, x86_64) 44-mal langsamer war . Die Drei-Byte-Struktur ist ein Beispiel für eine sehr langsame Eigenschaft.Interessante Randnotiz: Benutzerdefinierte Accessoren der Drei-Byte-Struktur waren 52-mal schneller als die synthetisierten Atom-Accessoren; oder 84% der Geschwindigkeit synthetisierter nichtatomarer Accessoren.
Objekte in umstrittenen Fällen können auch das 50-fache überschreiten.
Aufgrund der Anzahl der Optimierungen und Variationen bei den Implementierungen ist es ziemlich schwierig, die tatsächlichen Auswirkungen in diesen Kontexten zu messen. Möglicherweise hören Sie häufig etwas wie "Vertrauen Sie ihm, es sei denn, Sie profilieren und stellen fest, dass es ein Problem ist". Aufgrund der Abstraktionsebene ist es tatsächlich ziemlich schwierig, die tatsächlichen Auswirkungen zu messen. Das Abrufen der tatsächlichen Kosten aus Profilen kann sehr zeitaufwändig und aufgrund von Abstraktionen sehr ungenau sein. Auch ARC vs MRC können einen großen Unterschied machen.
Lassen Sie uns also einen Schritt zurücktreten und uns nicht auf die Implementierung von Eigenschaftszugriffen konzentrieren. Wir werden die üblichen Verdächtigen wie einbeziehen
objc_msgSend
und einige reale High-Level-Ergebnisse für viele Aufrufe einesNSString
Getters in unbestrittenen Fällen untersuchen (Werte in Sekunden):Wie Sie wahrscheinlich erraten haben, trägt die Aktivität / das Radfahren der Referenzzählung wesentlich zur Atomik und unter ARC bei. Sie würden auch größere Unterschiede in umstrittenen Fällen sehen.
Obwohl ich der Leistung große Aufmerksamkeit schenke, sage ich immer noch Semantik zuerst! . In der Zwischenzeit hat die Leistung für viele Projekte eine niedrige Priorität. Die Kenntnis der Ausführungsdetails und der Kosten der von Ihnen verwendeten Technologien schadet jedoch sicherlich nicht. Sie sollten die richtige Technologie für Ihre Bedürfnisse, Zwecke und Fähigkeiten verwenden. Dies erspart Ihnen hoffentlich einige Stunden Vergleiche und hilft Ihnen, eine fundiertere Entscheidung bei der Gestaltung Ihrer Programme zu treffen.
quelle
NSString
nicht unsterblichen Fall abgezielt :-ARC atomic (BASELINE): 100% -ARC nonatomic, synthesised: 94% -ARC nonatomic, user defined: 86% -MRC nonatomic, user defined: 5% -MRC nonatomic, synthesised: 19% -MRC atomic: 102%
- Die Ergebnisse sind heute etwas anders. Ich habe keine@synchronized
Vergleiche angestellt.@synchronized
ist semantisch anders, und ich halte es nicht für ein gutes Werkzeug, wenn Sie nicht triviale gleichzeitige Programme haben. Wenn Sie Geschwindigkeit brauchen, vermeiden Sie@synchronized
.Atomic = Gewindesicherheit
Nicht atomar = Keine Gewindesicherheit
Gewindesicherheit:
Instanzvariablen sind threadsicher, wenn sie sich beim Zugriff von mehreren Threads aus korrekt verhalten, unabhängig von der Planung oder Verschachtelung der Ausführung dieser Threads durch die Laufzeitumgebung und ohne zusätzliche Synchronisation oder andere Koordination seitens des aufrufenden Codes.
In unserem Kontext:
Wenn ein Thread den Wert der Instanz ändert, steht der geänderte Wert allen Threads zur Verfügung, und es kann jeweils nur ein Thread den Wert ändern.
Verwendungszweck
atomic
:Wenn auf die Instanzvariable in einer Multithread-Umgebung zugegriffen werden soll.
Implikation von
atomic
:Nicht so schnell,
nonatomic
weilnonatomic
es zur Laufzeit keine Watchdog-Arbeit erfordert.Verwendungszweck
nonatomic
:Wenn die Instanzvariable nicht von mehreren Threads geändert wird, können Sie sie verwenden. Es verbessert die Leistung.
quelle
Ich habe hier eine ziemlich gute Erklärung für atomare und nichtatomare Eigenschaften gefunden . Hier ist ein relevanter Text aus demselben:
Da die
atomic
Variablen nicht unterbrochen werden können, ist der von ihnen zu jedem Zeitpunkt enthaltene Wert (Thread-Sperre) garantiert nicht beschädigt , obwohl durch die Sicherstellung dieser Thread-Sperre der Zugriff auf sie langsamer wird.non-atomic
Variablen hingegen geben keine solche Garantie, bieten jedoch den Luxus eines schnelleren Zugriffs. Um es zusammenzufassen, gehennon-atomic
Sie zu, wenn Sie wissen, dass nicht mehrere Threads gleichzeitig auf Ihre Variablen zugreifen, und beschleunigen Sie die Arbeit.quelle
Nachdem ich so viele Artikel gelesen, Stapelüberlauf-Beiträge verfasst und Demo-Anwendungen zum Überprüfen von Attributen variabler Eigenschaften erstellt hatte, entschied ich mich, alle Attributinformationen zusammenzustellen:
atomic
// Standardnonatomic
strong = retain
// Standardweak = unsafe_unretained
retain
assign
// Standardunsafe_unretained
copy
readonly
readwrite
// StandardIm Artikel Variable Eigenschaftsattribute oder Modifikatoren in iOS finden Sie alle oben genannten Attribute, und das wird Ihnen definitiv helfen.
atomic
atomic
bedeutet, dass nur ein Thread auf die Variable zugreift (statischer Typ).atomic
ist threadsicher.atomic
ist das StandardverhaltenBeispiel:
nonatomic
nonatomic
bedeutet, dass mehrere Threads auf die Variable zugreifen (dynamischer Typ).nonatomic
ist thread-unsicher.nonatomic
ist NICHT Standardverhalten. Wir müssen dasnonatomic
Schlüsselwort im Eigenschaftsattribut hinzufügen .Beispiel:
quelle
Atomic:
Atomic garantiert, dass der Zugriff auf das Grundstück auf atomare Weise erfolgt. Beispielsweise werden immer vollständig initialisierte Objekte zurückgegeben. Jedes Abrufen / Festlegen einer Eigenschaft in einem Thread muss abgeschlossen sein, bevor ein anderer darauf zugreifen kann.
Wenn Sie sich vorstellen, dass die folgende Funktion auf zwei Threads gleichzeitig ausgeführt wird, können Sie sehen, warum die Ergebnisse nicht schön sind.
Vorteile: Die Rückgabe vollständig initialisierter Objekte ist bei Multithreading die beste Wahl.
Nachteile: Leistungseinbußen, macht die Ausführung etwas langsamer
Nicht atomar:
Im Gegensatz zu Atomic wird nicht jedes Mal eine vollständig initialisierte Objektrückgabe sichergestellt.
Vorteile: Extrem schnelle Ausführung.
Nachteile: Chancen auf Müllwert bei Multithreading.
quelle
Einfachste Antwort zuerst: Es gibt keinen Unterschied zwischen Ihren zweiten beiden Beispielen. Standardmäßig sind Eigenschaftszugriffsatome atomar.
Atomic Accessors in einer Umgebung ohne Müllabfuhr (dh bei Verwendung von Retain / Release / Autorelease) verwenden eine Sperre, um sicherzustellen, dass ein anderer Thread die korrekte Einstellung / das Abrufen des Werts nicht beeinträchtigt.
Weitere Informationen und weitere Überlegungen zum Erstellen von Multithread-Apps finden Sie im Abschnitt " Leistung und Threading " der Apple Objective-C 2.0-Dokumentation.
quelle
Atomic bedeutet, dass nur ein Thread auf die Variable zugreift (statischer Typ). Atomic ist threadsicher, aber langsam.
Nichtatomar bedeutet, dass mehrere Threads auf die Variable zugreifen (dynamischer Typ). Nichtatomar ist threadsicher, aber schnell.
quelle
Atomic ist threadsicher , langsam und sicher (nicht garantiert) dass nur der gesperrte Wert bereitgestellt wird, unabhängig davon, wie viele Threads versuchen, über dieselbe Zone zuzugreifen. Bei Verwendung von Atomic wird ein in diese Funktion geschriebener Code zum Teil des kritischen Abschnitts, für den jeweils nur ein Thread ausgeführt werden kann.
Es gewährleistet nur die Gewindesicherheit; es garantiert das nicht. Was ich meine ist, dass Sie einen erfahrenen Fahrer für Ihr Auto einstellen, der jedoch nicht garantiert, dass das Auto keinen Unfall erleidet. Die Wahrscheinlichkeit bleibt jedoch am geringsten.
Atomic - es kann nicht zerlegt werden, daher wird das Ergebnis erwartet. Mit nonatomic - Wenn ein anderer Thread auf die Speicherzone zugreift, kann er diese ändern, sodass das Ergebnis unerwartet ist.
Code Talk:
Atomic macht Getter und Setter des Property Thread sicher. Zum Beispiel, wenn Sie geschrieben haben:
ist threadsicher.
ist NICHT threadsicher.
quelle
Es gibt kein solches Schlüsselwort "atomar"
Wir können die oben genannten wie verwenden
Siehe Frage zum Stapelüberlauf . Ich erhalte Probleme, wenn ich @property (atomar, beibehalten) NSString * myString verwende .
quelle
Weitere Informationen finden Sie hier: https://realm.io/news/tmi-objective-c-property-attributes/
quelle
Die Standardeinstellung ist
atomic
, dies bedeutet, dass es Sie Leistung kostet, wenn Sie die Eigenschaft verwenden, aber es ist threadsicher. Objective-C setzt eine Sperre, sodass nur der eigentliche Thread auf die Variable zugreifen kann, solange der Setter / Getter ausgeführt wird.Beispiel mit MRC einer Eigenschaft mit einem ivar _internal:
Die letzten beiden sind also gleich:
Auf der anderen Seite wird
nonatomic
Ihrem Code nichts hinzugefügt. Es ist also nur threadsicher, wenn Sie den Sicherheitsmechanismus selbst codieren.Die Schlüsselwörter müssen überhaupt nicht als erstes Eigenschaftsattribut geschrieben werden.
Vergessen Sie nicht, dies bedeutet nicht, dass die Eigenschaft als Ganzes threadsicher ist. Nur der Methodenaufruf des Setzers / Getters ist. Aber wenn Sie einen Setter und danach gleichzeitig einen Getter mit 2 verschiedenen Threads verwenden, kann dieser auch kaputt gehen!
quelle
Bevor Sie beginnen: Sie müssen wissen, dass jedes Objekt im Speicher aus dem Speicher freigegeben werden muss, damit ein neuer Writer ausgeführt werden kann. Sie können nicht einfach auf etwas schreiben, wie Sie es auf Papier tun. Sie müssen es zuerst löschen (freigeben) und dann können Sie darauf schreiben. Wenn im Moment , dass der Lösch erfolgt (oder halb fertig) und nichts hat noch geschrieben worden (oder die Hälfte geschrieben hat) und Sie versuchen , zu lesen , könnte es sehr problematisch sein! Atomic und Nonatomic helfen Ihnen, dieses Problem auf unterschiedliche Weise zu behandeln.
Lesen Sie zuerst diese Frage und dann die Antwort von Bbum . Lesen Sie dann außerdem meine Zusammenfassung.
atomic
wird IMMER garantierenWas?! Unterscheiden sich Multithreading und Thread-Sicherheit ?
Ja. Multithreading bedeutet: Mehrere Threads können gemeinsam genutzte Daten gleichzeitig lesen, und wir stürzen nicht ab. Dies garantiert jedoch nicht, dass Sie nicht von einem nicht automatisch freigegebenen Wert lesen. Mit der Thread-Sicherheit wird garantiert, dass das, was Sie lesen, nicht automatisch freigegeben wird. Der Grund dafür, dass wir nicht standardmäßig alles atomar machen, ist, dass es Leistungskosten gibt und für die meisten Dinge keine Thread-Sicherheit benötigt wird. Einige Teile unseres Codes benötigen es und für diese wenigen Teile müssen wir unseren Code threadsicher unter Verwendung von Sperren, Mutex oder Synchronisation schreiben.
nonatomic
Insgesamt unterscheiden sie sich in 2 Aspekten:
Absturz oder nicht, weil ein Autorelease-Pool vorhanden ist oder nicht.
Erlaubt, mitten in einem 'noch nicht abgeschlossenen Schreib- oder leeren Wert' gelesen zu werden oder nicht zuzulassen und nur zu lesen, wenn der Wert vollständig geschrieben ist.
quelle
Wenn Sie Ihre Eigenschaft in Multithread-Code verwenden, können Sie den Unterschied zwischen nichtatomaren und atomaren Attributen erkennen. Nichtatomar ist schneller als atomar und atomar ist threadsicher, nicht nichtatomar.
Vijayendra Tripathi hat bereits ein Beispiel für eine Multithread-Umgebung gegeben.
quelle
Wie zu erklären:
Da Atomic standardmäßig so ist,
UND in der Implementierungsdatei
Angenommen, eine Aufgabe, die sich auf drei Eigenschaften bezieht, ist
Alle Eigenschaften arbeiten parallel (wie asynchron).
Wenn Sie "Name" von Thread A aufrufen ,
Und
Zur gleichen Zeit, wenn Sie anrufen
von Faden B ,
Wenn die Eigenschaft * name nicht atomar ist, dann
Das ist der Grund, warum nicht atomar als Thread unsicher bezeichnet wird. Aufgrund der parallelen Ausführung ist die Leistung jedoch schnell
Wenn die Eigenschaft * name atomar ist
Aus diesem Grund wird Atomic als Thread-sicher und als Read-Write-Safe bezeichnet
Eine solche Situationsoperation wird seriell ausgeführt. Und langsam in der Leistung
- Nichtatomar bedeutet, dass mehrere Threads auf die Variable zugreifen (dynamischer Typ).
- Nichtatomar ist Thread unsicher.
- aber es ist schnell in der Leistung
-Nonatomic ist KEIN Standardverhalten. Wir müssen dem Eigenschaftsattribut ein nichtatomares Schlüsselwort hinzufügen.
Für In Swift Bestätigen, dass Swift-Eigenschaften im ObjC-Sinne nichtatomar sind. Ein Grund ist, dass Sie darüber nachdenken, ob die Atomizität pro Eigenschaft für Ihre Bedürfnisse ausreicht.
Referenz: https://forums.developer.apple.com/thread/25642
Weitere Informationen finden Sie auf der Website http://rdcworld-iphone.blogspot.in/2012/12/variable-property-attributes-or.html
quelle
atomic
ist NICHT threadsicher! Es ist widerstandsfähiger gegen Fadenprobleme, aber nicht fadensicher. Es stellt nur sicher, dass Sie einen ganzen Wert erhalten, auch bekannt als "korrekter" Wert (Binärebene), aber es stellt keinesfalls sicher, dass es sich um den aktuellen und "korrekten" Wert für Ihre Geschäftslogik handelt (es kann sich um einen vergangenen Wert handeln und nach Ihrer Logik ungültig).Atomizität atomar (Standard)
nichtatomar
Mit freundlicher Genehmigung von https://academy.realm.io/posts/tmi-objective-c-property-attributes/
Atomicity-Eigenschaftsattribute (atomar und nichtatomar) werden in der entsprechenden Swift-Eigenschaftsdeklaration nicht berücksichtigt, aber die Atomicity-Garantien der Objective-C-Implementierung gelten weiterhin, wenn von Swift aus auf die importierte Eigenschaft zugegriffen wird.
Wenn Sie also in Objective-C eine atomare Eigenschaft definieren, bleibt diese bei Verwendung durch Swift atomar.
Mit freundlicher Genehmigung von https://medium.com/@YogevSitton/atomic-vs-non-atomic-properties-crash-course-d11c23f4366c
quelle
Die atomare Eigenschaft stellt sicher, dass ein vollständig initialisierter Wert beibehalten wird, unabhängig davon, wie viele Threads Getter & Setter ausführen.
Die nichtatomare Eigenschaft gibt an, dass synthetisierte Accessoren einfach einen Wert direkt festlegen oder zurückgeben, ohne dass garantiert werden kann, was passiert, wenn von verschiedenen Threads gleichzeitig auf denselben Wert zugegriffen wird.
quelle
Atomic bedeutet, dass jeweils nur ein Thread auf die Variable zugreifen kann (statischer Typ). Atomic ist threadsicher, aber langsam.
Nichtatomar bedeutet, dass mehrere Threads gleichzeitig auf die Variable zugreifen können (dynamischer Typ). Nichtatomar ist threadsicher, aber schnell.
quelle
Wenn Sie Atomic verwenden, bedeutet dies, dass der Thread sicher und schreibgeschützt ist. Wenn Sie nichtatomar verwenden, bedeutet dies, dass mehrere Threads auf die Variable zugreifen und Thread-unsicher sind. Es wird jedoch schnell ausgeführt und es werden Lese- und Schreibvorgänge ausgeführt. Dies ist ein dynamischer Typ.
quelle
Die Wahrheit ist, dass sie Spin Lock verwenden, um atomare Eigenschaften zu implementieren. Der Code wie folgt:
quelle
Lassen Sie uns die Mutex-Sperre verstehen, um die gesamte Verwirrung zu vereinfachen.
Die Mutex-Sperre sperrt gemäß dem Namen die Veränderlichkeit des Objekts. Wenn also eine Klasse auf das Objekt zugreift, kann keine andere Klasse auf dasselbe Objekt zugreifen.
@sychronise
Stellt in iOS auch die Mutex-Sperre bereit. Jetzt wird sie im FIFO-Modus bereitgestellt und stellt sicher, dass der Fluss nicht von zwei Klassen beeinflusst wird, die dieselbe Instanz gemeinsam nutzen. Wenn sich die Aufgabe jedoch im Hauptthread befindet, vermeiden Sie den Zugriff auf Objekte mithilfe atomarer Eigenschaften, da dies Ihre Benutzeroberfläche enthalten und die Leistung beeinträchtigen kann.quelle
Atomic: Stellen Sie die Thread-Sicherheit sicher, indem Sie den Thread mit NSLOCK sperren.
Nicht atomar: Gewährleistet keine Gewindesicherheit, da kein Gewindesperrmechanismus vorhanden ist.
quelle
Atomare Eigenschaften : - Wenn eine Variable, der eine atomare Eigenschaft zugewiesen wurde, dh nur einen Threadzugriff hat und threadsicher und in Bezug auf die Leistung gut ist, ein Standardverhalten aufweist.
Nichtatomare Eigenschaften : - Wenn eine Variable, der eine atomare Eigenschaft zugewiesen wurde, dh über einen Multi-Thread-Zugriff verfügt und nicht threadsicher und in der Leistungsperspektive langsam ist, ein Standardverhalten aufweist und zwei verschiedene Threads gleichzeitig auf eine Variable zugreifen möchten es wird unerwartete Ergebnisse geben.
quelle