1951 Stimmen

Was ist der Unterschied zwischen den atomaren und nichtatomaren Attributen?

Was tun atomic y nonatomic in Eigenschaftserklärungen bedeuten?

@property(nonatomic, retain) UITextField *userName;
@property(atomic, retain) UITextField *userName;
@property(retain) UITextField *userName;

Was ist der operative Unterschied zwischen diesen drei?

10voto

Shourob Datta Punkte 1525
  • -Atomisch bedeutet, dass nur ein Thread auf die Variable zugreift (statischer Typ).
  • -Atomic ist thread-sicher.
  • -aber es ist langsam in der Leistung

Wie man sich anmeldet:

Da atomar so Standard ist,

@property (retain) NSString *name;

AND in der Implementierungsdatei

self.name = @"sourov";

Angenommen, eine Aufgabe, die sich auf drei Eigenschaften bezieht, ist

 @property (retain) NSString *name;
 @property (retain) NSString *A;
 @property (retain) NSString *B;
 self.name = @"sourov";

Alle Eigenschaften arbeiten parallel (wie asynchron).

Wenn Sie "Name" aus dem Thread aufrufen A ,

Und

Wenn Sie zur gleichen Zeit

[self setName:@"Datta"]

vom Gewinde B ,

Jetzt Wenn die Eigenschaft *name nichtatomar ist dann

  • Es wird der Wert "Datta" für A zurückgegeben
  • Es wird der Wert "Datta" für B zurückgegeben

Das ist der Grund, warum nicht atomar ist Thread unsicher genannt, aber es ist schnell in der Leistung wegen der parallelen Ausführung

Wenn die Eigenschaft *name atomar ist

  • Sie wird den Wert "Sourov" für A sicherstellen
  • Dann wird für B der Wert "Datta" zurückgegeben.

Deshalb heißt atomic auch thread Safe y Deshalb wird es als schreib- und lesegeschützt bezeichnet.

In einer solchen Situation wird der Vorgang seriell durchgeführt. Und langsam in der Leistung

- Nichtatomar bedeutet, dass mehrere Threads auf die Variable zugreifen (dynamischer Typ).

- Nonatomic ist threadunsicher.

- aber es ist schnell in der Leistung

Nonatomic ist NICHT das Standardverhalten, wir müssen das Schlüsselwort nonatomic im Property-Attribut hinzufügen.

Für In Swift Bestätigung, dass Swift-Eigenschaften nicht atomar im Sinne von ObjC sind. Ein Grund dafür ist, dass Sie darüber nachdenken, ob die Atomarität pro Eigenschaft für Ihre Bedürfnisse ausreichend ist.

Referenz: https://forums.developer.apple.com/thread/25642

Für weitere Informationen besuchen Sie bitte die Website http://rdcworld-iphone.blogspot.in/2012/12/variable-property-attributes-or.html

5 Stimmen

Wie schon viele, viele, viele, viele andere gesagt haben, atomic es NICHT thread-safe! Es ist mehr resistent zu Thread-Problemen, aber nicht Thread-sicher. Es stellt lediglich sicher, dass Sie einen ganzen Wert erhalten, d.h. einen "richtigen" Wert (binäre Ebene), aber keineswegs, dass es sich um den aktuellen und "richtigen" Wert für Ihre Geschäftslogik handelt (es könnte ein vergangener Wert sein, der für Ihre Logik ungültig ist).

10voto

mfaani Punkte 28161

Bevor Sie beginnen: Sie müssen wissen, dass jedes Objekt im Speicher aus dem Speicher entfernt werden muss, damit ein neuer Writer ausgeführt werden kann. Sie können nicht einfach über etwas schreiben, wie Sie es auf dem Papier tun. Sie muss zuerst löschen (deallocieren) und dann können Sie darauf schreiben. Wenn in dem Moment, in dem der Löschvorgang abgeschlossen (oder halb abgeschlossen) ist und nichts hat noch geschrieben wurde (oder halb geschrieben wurde) und Sie versuchen, es zu lesen, könnte sehr problematisch sein! Atomar und nichtatomar helfen Ihnen, dieses Problem auf unterschiedliche Weise zu behandeln.

Erste Lektüre este Frage und lesen Sie dann Bbum's Antwort . Lesen Sie dazu dann meine Zusammenfassung.


atomic wird IMMER garantieren

  • Wenn zwei verschiedene Personen gleichzeitig lesen und schreiben wollen, wird Ihr Papier nicht einfach verbrannt! --> Ihre Anwendung wird nie abstürzen, auch nicht in einer Race Condition.
  • Wenn eine Person versucht zu schreiben und nur 4 der 8 zu schreibenden Buchstaben geschrieben hat, dann kann niemand mittendrin lesen, das Lesen kann erst erfolgen, wenn alle 8 Buchstaben geschrieben sind --> Es wird kein read(get) auf 'einem Thread passieren, der noch schreibt', d.h. wenn es 8 Bytes zu schreiben gibt und nur 4 Bytes geschrieben sind - bis zu diesem Moment ist es nicht erlaubt, davon zu lesen. Aber da ich gesagt habe, dass es nicht abstürzen wird, würde es von dem Wert eines autoreleased Objekt.
  • Si Sie schreiben haben das, was zuvor auf Papier geschrieben wurde, gelöscht hat und dann jemand Sie lesen will kann noch lesen. Wie? Sie lesen aus etwas, das dem Papierkorb von Mac OS ähnelt (da der Papierkorb noch nicht zu 100 % gelöscht ist... er befindet sich in der Schwebe) ---> Wenn ThreadA lesen soll, während ThreadB die Zuweisung bereits aufgehoben hat, um zu schreiben, würden Sie einen Wert entweder aus dem letzten vollständig geschriebenen Wert von ThreadB oder aus dem Autorelease-Pool erhalten.

Retain-Zahlen sind die Art und Weise, in der der Speicher in Objective-C verwaltet wird. Wenn Sie ein Objekt erstellen, hat es einen Retain Count von 1. Wenn Sie einem Objekt eine Retain-Nachricht, wird sein Retain-Zähler um 1 erhöht. Wenn Sie einem Objekt eine Freigabenachricht senden, wird sein Retain-Zähler um 1 dekrementiert. um 1. Wenn Sie einem Objekt eine Autorelease-Meldung die Anzahl der zurückgehaltenen Daten irgendwann in der Zukunft um 1 dekrementiert wird. Wenn der Retain Count eines Objekts Zähler auf 0 reduziert wird, wird es freigegeben.

  • Atomic nicht Thread-Sicherheit garantieren, obwohl es nützlich ist, um Thread-Sicherheit zu erreichen. Die Thread-Sicherheit hängt davon ab, wie Sie Ihren Code schreiben/aus welcher Thread-Warteschlange Sie lesen/schreiben. Sie garantiert nur nicht absturzsicheres Multithreading.

Was?! Sind Multithreading und Gewindesicherheit anders?

Ja. Multithreading bedeutet, dass mehrere Threads gleichzeitig ein gemeinsam genutztes Datenstück lesen können, ohne dass es zu einem Absturz kommt, aber es garantiert nicht, dass man nicht von einem nicht freigegebenen Wert liest. Mit Thread Safety ist garantiert, dass das, was Sie lesen, nicht automatisch freigegeben wird. Der Grund dafür, dass wir nicht alles standardmäßig atomar machen, ist, dass dies mit Leistungseinbußen verbunden ist und dass wir Threadsicherheit für die meisten Dinge nicht wirklich brauchen. Einige wenige Teile unseres Codes benötigen sie, und für diese wenigen Teile müssen wir unseren Code auf eine thread-sichere Weise schreiben, indem wir Sperren, Mutex oder Synchronisierung verwenden.


nonatomic

  • Da es so etwas wie den Mac OS-Papierkorb nicht gibt, kümmert es niemanden, ob man immer einen Wert erhält oder nicht (<-- Das könnte zu einem Absturz führen), und es kümmert auch niemanden, wenn jemand versucht, die Hälfte des Geschriebenen zu lesen (obwohl das Schreiben auf halber Strecke im Speicher sich sehr von dem Schreiben auf Papier unterscheidet, im Speicher könnte man einen verrückten, dummen Wert von vorher erhalten, während man auf Papier nur die Hälfte des Geschriebenen sieht) --> Garantiert keinen Absturz, da es keinen Autorelease-Mechanismus verwendet.
  • Es ist nicht garantiert, dass alle geschriebenen Werte gelesen werden!
  • Ist schneller als atomar

Insgesamt unterscheiden sie sich in 2 Aspekten:

  • Absturz oder nicht Absturz aufgrund eines Autorelease-Pools oder eines nicht vorhandenen Pools.

  • Zulassen, dass mitten in einem "noch nicht abgeschlossenen Schreibvorgang oder leeren Wert" gelesen wird, oder nicht zulassen und nur zulassen, dass gelesen wird, wenn der Wert vollständig geschrieben.

9voto

Ankul Gaur Punkte 137

Wenn Sie Ihre Eigenschaft in Multithreading-Code verwenden, können Sie den Unterschied zwischen nichtatomaren und atomaren Attributen erkennen. Nonatomic ist schneller als atomic und atomic ist thread-safe, nicht nonatomic.

Vijayendra Tripathi hat bereits ein Beispiel für eine Multithreading-Umgebung gegeben.

9voto

Suraj K Thomas Punkte 5425

Atomarität atomar (Standard)

Atomic ist die Standardeinstellung: Wenn Sie nichts eingeben, ist Ihre Eigenschaft atomar. Eine atomare Eigenschaft garantiert, dass, wenn Sie versuchen, aus ihr zu lesen einen gültigen Wert zurückerhält. Sie gibt keine Garantien was dieser Wert sein könnte, aber Sie erhalten gute Daten zurück, nicht nur Speicherschrott. Dies ermöglicht es Ihnen, wenn Sie mehrere Threads oder mehrere Prozesse auf eine einzelne Variable verweisen, kann ein kann ein Thread lesen und ein anderer Thread schreiben. Wenn sie zur gleichen Zeit zur gleichen Zeit, erhält der lesende Thread garantiert einen der beiden Werte: entweder vor der Änderung oder nach der Änderung. Was atomic nicht bietet keine Garantie dafür, welchen dieser Werte man erhalten wird. erhalten könnte. Atomic wird sehr häufig mit Thread-Safe verwechselt, und das ist nicht korrekt. Sie müssen Ihre Thread-Sicherheit auf andere Weise garantieren. Atomic garantiert jedoch, dass wenn Sie versuchen zu lesen, eine Art von Wert zurückbekommt.

nichtatomar

Auf der anderen Seite bedeutet "nicht-atomar", wie Sie wahrscheinlich erraten können, einfach nur, "mach nicht dieses atomare Zeug". Was Sie verlieren, ist die Garantie, dass Sie immer etwas zurückbekommt. Wenn Sie versuchen, in der Mitte einer Schreibvorgangs zu lesen, könnte man Datenmüll zurückbekommen. Aber auf der anderen Seite ist man ein wenig schneller. Da atomare Eigenschaften etwas zaubern müssen um zu garantieren, dass man einen Wert zurückbekommt, sind sie ein bisschen langsamer. Wenn eine Eigenschaft ist, auf die Sie häufig zugreifen, sollten Sie auf nichtatomare auf nichtatomare Eigenschaften zurückgreifen, um sicherzustellen, dass Sie diesen Geschwindigkeitsverlust nicht Nachteil. Zugriff auf

mit freundlicher Genehmigung https://academy.realm.io/posts/tmi-objective-c-property-attributes/

Atomare Eigenschaftsattribute (atomar und nichtatomar) spiegeln sich nicht in der entsprechenden Swift-Eigenschaftsdeklaration wider, aber die Atomaritätsgarantien der Objective-C-Implementierung gelten weiterhin, wenn von Swift aus auf die importierte Eigenschaft zugegriffen wird.

Wenn Sie also eine atomare Eigenschaft in Objective-C definieren, bleibt sie atomar, wenn sie von Swift verwendet wird.

mit freundlicher Genehmigung https://medium.com/@YogevSitton/atomic-vs-non-atomic-properties-crash-course-d11c23f4366c

5voto

Laxman Sahni Punkte 542

Die atomare Eigenschaft sorgt dafür, dass ein vollständig initialisierter Wert erhalten bleibt, unabhängig davon, wie viele Threads Getter und Setter darauf ausführen.

Die nicht-atomare Eigenschaft gibt an, dass synthetisierte Accessors einfach einen Wert direkt setzen oder zurückgeben, ohne Garantien darüber, was passiert, wenn auf denselben Wert gleichzeitig von verschiedenen Threads aus zugegriffen wird.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X