Jaka jest różnica między atrybutami atomowymi i nieatomowymi?

Co oznaczają atomic i nonatomic w oświadczeniach majątkowych?

@property(nonatomic, retain) UITextField *userName;
@property(atomic, retain) UITextField *userName;
@property(retain) UITextField *userName;
Jaka jest różnica między tymi trzema?
Author: Chirag Kothiya, 2009-02-26

26 answers

Dwa ostatnie są identyczne;" atomic " jest domyślnym zachowaniem (zauważ, że w rzeczywistości nie jest to słowo kluczowe; jest określone tylko przez brak nonatomic -- atomic został dodany jako słowo kluczowe w ostatnich wersjach llvm/clang).

Zakładając, że jesteś @ syntetyzując implementacje metody, atomic vs. non-atomic zmienia wygenerowany kod. Jeśli piszesz własny setter/getters, atomic / nonatomic/retain/assign / copy są tylko doradcze. (Uwaga: @ synthesize jest teraz domyślne zachowanie w ostatnich wersjach LLVM. Nie ma również potrzeby deklarowania zmiennych instancji; będą one również syntetyzowane automatycznie i będą miały _ poprzedzone ich nazwą, aby zapobiec przypadkowemu bezpośredniemu dostępowi).

Z "atomowym", zsyntetyzowany setter / getter zapewni, że cała wartość jest zawsze zwracana z gettera lub ustawiana przez setter, niezależnie od aktywności settera w jakimkolwiek innym wątku. Oznacza to, że jeśli wątek A znajduje się w środku gettera, podczas gdy wątek B wywołuje setter, rzeczywista realna wartość -- obiekt z autorelementem, najprawdopodobniej -- zostanie zwrócona do wywołującego w A.

W nonatomic nie udziela się takich gwarancji. Tak więc {[1] } jest znacznie szybszy niż"atomowy".

To, co" atomowe " robi , a nie , to gwarancja bezpieczeństwa wątku. Jeśli wątek A wywołuje getter jednocześnie z wątkiem B I C wywołując setter o różnych wartościach, wątek A może otrzymać jedną z trzech wartości zwróconych -- ten przed wywołaniem jakichkolwiek seterów lub którejkolwiek z wartości przekazanych do seterów w B i C. Podobnie, obiekt może skończyć z wartością z B lub C, nie sposób powiedzieć.

Zapewnienie integralności danych - jedno z podstawowych wyzwań programowania wielowątkowego - jest osiągane za pomocą innych środków.

Dodanie do tego:

atomicity jednej właściwości również nie może zagwarantować bezpieczeństwa wątku, gdy wiele zależnych właściwości są w Graj.

Rozważmy:

 @property(atomic, copy) NSString *firstName;
 @property(atomic, copy) NSString *lastName;
 @property(readonly, atomic, copy) NSString *fullName;

W tym przypadku wątek a może zmienić nazwę obiektu przez wywołanie setFirstName:, a następnie wywołanie setLastName:. W międzyczasie wątek B może wywołać fullName pomiędzy dwoma wywołaniami wątku a i otrzyma nowe imię połączone ze starym nazwiskiem.

Aby rozwiązać ten problem, potrzebujesz modelu transakcyjnego . Tj. inny rodzaj synchronizacji i / lub wykluczenia, który pozwala wykluczyć dostęp do fullName, podczas gdy zależne właściwości są na bieżąco.

 1772
Author: bbum,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-28 16:52:14

Jest to wyjaśnione w dokumentacji Apple , ale poniżej kilka przykładów tego, co się naprawdę dzieje.

zauważ, że nie ma słowa kluczowego "atomic", jeśli nie podasz "nonatomic", wtedy właściwość jest atomowa, ale podanie" atomic " jawnie spowoduje błąd.

Jeśli nie podasz "nonatomic", wtedy właściwość jest atomic, ale nadal możesz jawnie podać "atomic" w ostatnich wersjach, jeśli chcesz.

//@property(nonatomic, retain) UITextField *userName;
//Generates roughly

- (UITextField *) userName {
    return userName;
}

- (void) setUserName:(UITextField *)userName_ {
    [userName_ retain];
    [userName release];
    userName = userName_;
}

Teraz atomowy wariant jest nieco bardziej skomplikowany:

//@property(retain) UITextField *userName;
//Generates roughly

- (UITextField *) userName {
    UITextField *retval = nil;
    @synchronized(self) {
        retval = [[userName retain] autorelease];
    }
    return retval;
}

- (void) setUserName:(UITextField *)userName_ {
    @synchronized(self) {
      [userName_ retain];
      [userName release];
      userName = userName_;
    }
}

Zasadniczo, wersja atomowa musi mieć blokadę w celu zagwarantowania bezpieczeństwa wątku, a także powoduje, że liczba ref na obiekcie (i liczba autoelementów, aby ją zrównoważyć) tak, że obiekt jest gwarantowany dla wywołującego, w przeciwnym razie istnieje potencjalny stan wyścigu, jeśli inny wątek ustawia wartość, powodując spadek liczby ref do 0.

Istnieje naprawdę wiele różnych wariantów tego, jak te rzeczy działa w zależności od tego, czy właściwości są wartościami skalarnymi, czy obiektami, oraz w jaki sposób zachowują, kopiują, odczytują, nieatomowe itp. Ogólnie rzecz biorąc, syntezatory właściwości po prostu wiedzą, jak zrobić "właściwą rzecz" dla wszystkich kombinacji.

 361
Author: Louis Gerbarg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-09-18 14:16:55

Atomic

  • jest domyślnym zachowaniem
  • upewni się, że proces jest zakończony przez procesor, zanim inny proces uzyska dostęp do zmiennej
  • nie jest szybki, ponieważ zapewnia całkowite zakończenie procesu

Non-Atomic

  • nie jest domyślnym zachowaniem
  • faster (dla kodu syntetyzowanego, czyli dla zmiennych utworzonych przy użyciu @property i @synthesize)
  • nie thread-safe
  • może spowodować nieoczekiwane zachowanie, gdy dwa różne procesy uzyskują dostęp do tej samej zmiennej w tym samym czasie
 171
Author: raw3d,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-20 09:12:55

Najlepszym sposobem na zrozumienie różnicy jest użycie poniższego przykładu.

Załóżmy, że istnieje atomic string property o nazwie "name", i jeśli wywołasz {[0] } z wątku A, wywołasz [self setName:@"B"] z wątku B, A wywołasz [self name] z wątku C, wtedy wszystkie operacje na różnych wątkach będą wykonywane seryjnie, co oznacza, że jeśli jeden wątek wykonuje setter lub getter, to inne wątki będą czekać.

To sprawia, że właściwość "name" odczyt/zapis jest Bezpieczna, ale jeśli inny wątek, D, wywoła [name release] jednocześnie Ta operacja może spowodować awarię, ponieważ nie ma tu wywołania setter/getter. Co oznacza, że obiekt jest bezpieczny do odczytu/zapisu (ATOMIC), ale nie jest bezpieczny dla wątków, ponieważ inne wątki mogą jednocześnie wysyłać do obiektu dowolne wiadomości. Deweloper powinien zapewnić bezpieczeństwo dla takich obiektów.

Jeśli właściwość "name" była nieatomiczna, to wszystkie wątki w powyższym przykładzie - A,B, C i D będą wykonywane jednocześnie, dając dowolny nieprzewidywalny wynik. W przypadku atomic, albo jeden z A, B lub C będzie wykonywać pierwszy, ale D może nadal wykonywać równolegle.

 137
Author: Vijayendra,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-31 10:02:03

Składnia i semantyka są już dobrze zdefiniowane przez inne doskonałe odpowiedzi na to pytanie. Ponieważ wykonaniei wykonanie nie są zbyt szczegółowe, dodam swoją odpowiedź.

Jaka jest funkcjonalna różnica między tymi trzema?

Zawsze uważałem atomic za domyślną, dość ciekawą. Na poziomie abstrakcji pracujemy, wykorzystując właściwości atomowe dla klasy jako pojazdu, aby osiągnąć 100% gwint-bezpieczeństwo to sprawa narożna. Dla prawdziwie poprawne programy wielowątkowe, interwencja programisty jest prawie na pewno wymogiem. Tymczasem charakterystyka wydajności i wykonanie nie zostały jeszcze szczegółowo opisane. Po napisaniu kilku mocno wielowątkowych programów przez lata, deklarowałem swoje właściwości jako nonatomic cały czas, ponieważ atomic nie był sensowny w żadnym celu. Podczas dyskusji o szczegółach właściwości atomowych i nieatomowych to pytanie zrobiłem kilka profilów napotkałem kilka ciekawe wyniki.

Wykonanie

Ok. Pierwszą rzeczą, którą chciałbym wyjaśnić, jest to, że implementacja blokująca jest zdefiniowana i abstrakcyjna. Louis używa @synchronized(self) w swoim przykładzie -- widziałem to jako powszechne źródło zamieszania. Implementacja nie w rzeczywistości używa @synchronized(self); używa blokad spinowych na poziomie obiektu . Ilustracja Louisa jest dobra do ilustracji na wysokim poziomie przy użyciu konstrukcji, które wszyscy znamy, ale ważne jest, aby wiedz, że nie używa @synchronized(self).

Inną różnicą jest to, że właściwości atomowe zachowają / zwolnią cykl obiektów w getterze.

Wydajność

Oto interesująca część: wydajność przy użyciu własności atomowych dostępów w bezspornych (np. jednowątkowych) przypadkach może być naprawdę bardzo szybka w niektórych przypadkach. W mniej niż idealnych przypadkach użycie atomu może kosztować ponad 20 razy więcej niż narzut nonatomic. Podczas gdy sporna sprawa użycie 7 wątków było 44 razy wolniejsze dla trójbajtowej struktury (2.2 GHz Core i7 Quad Core, x86_64). Trójbajtowa struktura jest przykładem bardzo powolnej właściwości.

Ciekawa Uwaga: 3-bajtowe Accesory zdefiniowane przez użytkownika były 52 razy szybsze niż zsyntetyzowane atomic accessors; lub 84% szybkości syntetyzowanych Atomic accessors.

Obiekty w spornych sprawach mogą również przekroczyć 50 razy.

Ze względu na liczbę optymalizacji i zmian w implementacji, w tych kontekstach trudno jest zmierzyć rzeczywiste oddziaływanie. Często możesz usłyszeć coś w stylu "Zaufaj temu, chyba że profilujesz i uznasz, że jest to problem". Ze względu na poziom abstrakcji trudno jest zmierzyć rzeczywisty wpływ. Gromadzenie rzeczywistych kosztów z profili może być bardzo czasochłonne, a ze względu na abstrakcje, dość niedokładne. Również ARC vs MRC może zrobić dużą różnicę.

Więc cofnijmy się, Nie koncentrując się na realizacji z dostępu do własności, uwzględnimy zwykłych podejrzanych, takich jak objc_msgSend, i zbadamy niektóre rzeczywiste wyniki wysokiego poziomu dla wielu wywołań do gettera NSString w bezspornych przypadkach (wartości w sekundach):

  • MRC | nonatomic | ręcznie zaimplementowane gettery: 2
  • MRC | nonatomic | synthesized getter: 7
  • MRC | atomic / synthesized getter: 47
  • Arc | nieatomiczny / zsyntetyzowany getter: 38 (Uwaga: ARC dodaje liczbę refów tutaj)
  • ARC / atomic | pobrań: 47

Jak zapewne się domyślasz, aktywność/jazda na rowerze z licznikiem referencyjnym jest istotnym czynnikiem w atomice i pod ARC. Zauważy pan również większe różnice w spornych sprawach.

Chociaż zwracam szczególną uwagę na wydajność, nadal mówię najpierw semantyka!. Tymczasem wydajność jest niskim priorytetem dla wielu projektów. Jednak znajomość szczegółów wykonania i kosztów stosowanych technologii z pewnością nie zaszkodzi. Powinieneś skorzystać z prawa technologia dostosowana do Twoich potrzeb, celów i możliwości. Mam nadzieję, że pozwoli to zaoszczędzić kilka godzin porównań i pomoże Ci podjąć bardziej świadomą decyzję podczas projektowania programów.

 117
Author: justin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-10-17 03:07:27

Atomic = thread safety

Non-atomic = brak bezpieczeństwa wątku

Zabezpieczenie wątku:

Zmienne instancji

Są bezpieczne dla wątków, jeśli zachowują się poprawnie, gdy są dostępne z wielu wątków, niezależnie od planowania lub przeplatania wykonania tych wątków przez środowisko uruchomieniowe, i bez dodatkowej synchronizacji lub innej koordynacji ze strony kodu wywołującego.

W naszym kontekście:

Jeśli wątek zmieni wartość wystąpienia zmieniona wartość jest dostępna dla wszystkich wątków i tylko jeden wątek może zmienić wartość na raz.

Gdzie użyć atomic:

Jeśli zmienna instancji ma być dostępna w środowisku wielowątkowym.

Implikacja atomic:

Nie tak szybko jak nonatomic, ponieważ nonatomic nie wymaga żadnej pracy watchdoga z runtime .

Gdzie użyć nonatomic:

Jeśli zmienna instancji nie zostanie zmieniona przez wiele wątków możesz go użyć. Poprawia wydajność.

 95
Author: Durai Amuthan.H,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-31 13:57:20

Po przeczytaniu tak wielu artykułów, postów przepełnienia stosu i tworzenia aplikacji demonstracyjnych do sprawdzania atrybutów właściwości zmiennych, postanowiłem umieścić wszystkie informacje o atrybutach razem:

  1. atomic // Default
  2. nonatomic
  3. strong = retain // Default
  4. weak = unsafe_unretained
  5. retain
  6. assign // Default
  7. unsafe_unretained
  8. copy
  9. readonly
  10. readwrite // Default

W artykuł atrybuty właściwości zmiennych lub modyfikatory w systemie iOS możesz znaleźć wszystkie wyżej wymienione atrybuty, a to na pewno ci pomoże.

  1. atomic

    • atomic oznacza, że tylko jeden wątek ma dostęp do zmiennej (Typ statyczny).
    • atomic jest bezpieczny.
    • ale jest powolny w wydajności
    • atomic jest domyślnym zachowaniem
    • Atomic accessors w środowisku bez śmieci zbieranych (np. podczas używania retain/release/autorelease) użyje blokady, aby upewnić się, że inny wątek nie zakłóca prawidłowego ustawienia/uzyskania wartości.
    • to nie jest słowo kluczowe.

    Przykład:

        @property (retain) NSString *name;
    
        @synthesize name;
    
  2. nonatomic

    • nonatomic oznacza dostęp wielu wątków do zmiennej (Typ dynamiczny).
    • nonatomic jest wątek-niebezpieczne.
    • ale jest szybki w wydajności
    • nonatomic nie jest domyślnym zachowaniem. Musimy dodać słowo kluczowe nonatomic do atrybutu właściwości.
    • może to spowodować nieoczekiwane zachowanie, gdy dwa różne procesy (wątki) uzyskają dostęp do tej samej zmiennej w tym samym czasie.

    Przykład:

        @property (nonatomic, retain) NSString *name;
    
        @synthesize name;
    
 72
Author: swiftBoy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-31 10:22:24

Znalazłem dość dobrze wyjaśnione właściwości atomowe i niematomicznetutaj . Oto jakiś odpowiedni tekst z tego samego:

"atomowy" oznacza, że nie można go rozbić. W terminologii OS/programowanie atomowe wywołanie funkcji to takie, które nie może zostać przerwane - cała funkcja musi zostać wykonana, a nie zamieniona z procesora przez zwykłe przełączanie kontekstu systemu operacyjnego, dopóki nie zostanie zakończona. Na wszelki wypadek: ponieważ procesor może robić tylko jedną rzecz na raz, SYSTEM OPERACYJNY dzięki temu procesor jest w stanie w krótkim czasie obrócić dostęp do procesora do wszystkich uruchomionych procesów, co daje iluzję wielozadaniowości. Scheduler CPU może (i robi) przerwać proces w dowolnym momencie jego wykonania - nawet w wywołaniu funkcji mid. Tak więc w przypadku akcji takich jak aktualizacja współdzielonych zmiennych licznika, w których dwa procesy mogą próbować zaktualizować zmienną w tym samym czasie, muszą one być wykonywane "atomicznie", tzn. każda akcja aktualizacji musi zakończyć się w całości, zanim jakikolwiek inny proces może zostać zamieniony na procesor.

Więc zgaduję, że atomic w tym przypadku oznacza, że metody czytnika atrybutów nie mogą zostać przerwane - w efekcie co oznacza, że zmienna(y) czytana przez metodę nie może zmienić ich wartości w połowie drogi, ponieważ inny wątek/wywołanie/funkcja zostanie zamieniona na procesor.

Ponieważ zmienne atomic nie mogą zostać przerwane, wartość zawarta przez nie w dowolnym punkcie jest gwarantowana (thread-lock) jako nieskorrupowana, chociaż, zapewniając to blokada wątku sprawia, że dostęp do nich jest wolniejszy. Z drugiej strony zmienne nie dają takiej gwarancji, ale oferują Luksus szybszego dostępu. Podsumowując, wybierz non-atomic, gdy wiesz, że zmienne nie będą dostępne dla wielu wątków jednocześnie i przyspiesz wszystko.

 70
Author: tipycalFlow,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-17 05:39:03

Atomic:

Atomic gwarantuje, że dostęp do nieruchomości będzie dokonywany w sposób atomowy. Np. zawsze zwraca w pełni zainicjalizowany obiekt, każdy get / set właściwości w jednym wątku musi zostać ukończony, zanim inny będzie miał do niego dostęp.

Jeśli wyobrażasz sobie następującą funkcję występującą na dwóch wątkach jednocześnie, możesz zobaczyć, dlaczego wyniki nie byłyby ładne.

-(void) setName:(NSString*)string
{
  if (name)
  {
    [name release]; 
    // what happens if the second thread jumps in now !?
    // name may be deleted, but our 'name' variable is still set!
    name = nil;
  }

  ...
}

Plusy: Zwracanie w pełni zainicjowanych obiektów za każdym razem sprawia, że jest to najlepszy wybór w przypadku wielowątkowego.

Wady: Wydajność hit, sprawia, że wykonanie trochę wolniej

Nieatomowe:

W Przeciwieństwie Do Atomic, nie zapewnia pełnego powrotu obiektu za każdym razem.

Plusy: Niezwykle szybka realizacja.

Wady: Szanse na wartość śmieci w przypadku wielowątkowości.

 59
Author: Andrew Grant,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-17 22:32:12

Najprostsza odpowiedź pierwsza: nie ma różnicy między dwoma drugimi przykładami. Domyślnie accessors właściwości są atomic.

Atomic accessors w środowisku nie pobranym ze śmieci (np. podczas używania retain/release/autorelease) użyje blokady, aby upewnić się, że inny wątek nie zakłóci prawidłowego ustawienia/uzyskania wartości.

[[0]} zobacz sekcję "Performance and Threading " w dokumentacji Apple Objective-C 2.0, aby uzyskać więcej informacji i inne uwagi podczas tworzenia aplikacji wielowątkowych.
 52
Author: Jay O'Conor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-15 05:34:24

Atomic oznacza, że tylko jeden wątek uzyskuje dostęp do zmiennej (Typ statyczny). Atomic jest bezpieczny dla nici, ale jest powolny.

Nonatomic oznacza, że wiele wątków ma dostęp do zmiennej (Typ dynamiczny). Nieatomowe jest niebezpieczne, ale szybkie.

 31
Author: IOS Rocks,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-31 10:09:56

Atomic to thread safe , to slow i to dobrze zapewnia (nie gwarantuje) , że tylko zablokowana wartość jest dostarczana bez względu na to, ile wątków próbuje uzyskać dostęp do tej samej strefy. Podczas korzystania z atomic, fragment kodu napisany wewnątrz tej funkcji staje się częścią sekcji krytycznej, do której może wykonać tylko jeden wątek na raz.

Zapewnia tylko bezpieczeństwo wątku; nie gwarantuje tego. Chodzi mi o to, że zatrudniasz dla siebie fachowego kierowcę. samochód, mimo to nie gwarantuje, że samochód nie spotka się z wypadkiem. Jednak prawdopodobieństwo pozostaje najmniejsze.

Atomowy - nie da się go rozbić, więc oczekiwany jest wynik. Z nonatomic - gdy inny wątek wejdzie do strefy pamięci, może ją zmodyfikować, więc wynik jest nieoczekiwany.

Code Talk:

Atomic make getter and setter of the property thread safe. na przykład jeśli u napisałeś:

self.myProperty = value;

Jest bezpieczny.

[myArray addObject:@"Abc"] 

Nie jest bezpieczny dla wątku.

 15
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-02 09:43:33

Nie ma takiego słowa kluczowego "atomic"

@property(atomic, retain) UITextField *userName;

Możemy użyć powyższego typu

@property(retain) UITextField *userName;

Zobacz pytanie o przepełnienie stosu dostaję problemy, Jeśli używam @ property (atomic,retain)NSString *myString.

 13
Author: Deepak,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:33:24

Atomic (domyślnie)

Atomic jest wartością domyślną: jeśli nic nie wpisujesz, twoja właściwość jest atomic. Własności atomowej jest gwarantowane, że jeśli spróbujesz odczytać z to, otrzymasz z powrotem ważną wartość. Nie daje żadnych gwarancji o tym, jaka może być ta wartość, ale odzyskasz dobre dane, a nie tylko śmieciowe wspomnienia. To, co pozwala Ci zrobić, to jeśli masz wiele wątków lub wielu procesów wskazujących na jedną zmienną, jeden thread can read and another wątek może pisać. Jeśli uderzą w to samo czasu, wątek czytelnika ma gwarancję uzyskania jednej z dwóch wartości: albo przed zmianą, albo po zmianie. Czego atomic nie dać ci jest każdy rodzaj gwarancji, co do których z tych wartości można może być. Atomic jest bardzo często mylony z bezpiecznym, a to nie jest poprawne. Musisz zagwarantować bezpieczeństwo gwintu inne sposoby. Jednak atomic zagwarantuje, że jeśli spróbujesz przeczytać, odzyskasz jakiś wartość.

Nieatomowe

Z drugiej strony, nieatomowe, jak można się domyślać, oznacza po prostu, "nie rób tych atomowych rzeczy."To, co tracisz, to gwarancja, że zawsze coś Odzyskaj. Jeśli spróbujesz przeczytać w środku napisz, możesz odzyskać dane śmieci. Ale z drugiej strony, idziesz trochę szybciej. Ponieważ właściwości atomowe muszą być magiczne aby zagwarantować, że odzyskasz wartość, są one nieco wolniejsze. Jeśli jest to nieruchomość, która masz dostęp do wielu, możesz chcieć upuścić aby upewnić się, że nie ponosisz tej prędkości kara.

Zobacz więcej tutaj: https://realm.io/news/tmi-objective-c-property-attributes/

 13
Author: Proton,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-23 06:34:02

Domyślną wartością jest atomic, co oznacza, że kosztuje wydajność za każdym razem, gdy używasz właściwości, ale jest bezpieczna dla wątku. To, co robi Objective-C, ustawia blokadę, więc tylko rzeczywisty wątek może uzyskać dostęp do zmiennej, o ile zostanie uruchomiony setter/getter.

Przykład z MRC nieruchomości z ivar _internal:

[_internal lock]; //lock
id result = [[value retain] autorelease];
[_internal unlock];
return result;

Więc te dwa ostatnie są takie same:

@property(atomic, retain) UITextField *userName;

@property(retain) UITextField *userName; // defaults to atomic

Z drugiej strony nie dodaje nic do kodu. Jest więc Bezpieczny tylko wtedy, gdy kodujesz sam mechanizm bezpieczeństwa.

@property(nonatomic, retain) UITextField *userName;

słowa kluczowe nie muszą być w ogóle zapisywane jako pierwszy atrybut właściwości.

Nie zapominaj, że nie oznacza to, że nieruchomość jako całość jest Bezpieczna. Tylko wywołanie metody settera/gettera jest. Ale jeśli używasz setera, a następnie gettera w tym samym czasie z 2 różnymi nitkami, może on również zostać złamany!

 11
Author: Binarian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-27 09:43:38

Zanim zaczniesz: musisz wiedzieć, że każdy obiekt w pamięci musi zostać odłączony od pamięci, aby nowy pisarz mógł się wydarzyć. Nie możesz po prostu pisać na czymś, jak to robisz na papierze. Musisz najpierw usunąć (dealloc), a następnie możesz na nim napisać. Jeśli w chwili, gdy kasowanie jest zrobione (lub w połowie zrobione) i nic nie zostało jeszcze napisane (lub w połowie napisane) i spróbujesz to przeczytać, może być bardzo problematyczne! Atomic i nonatomic pomóc w leczeniu tego problemu w różnych sposoby.

Najpierw przeczytaj to pytanie, a następnie przeczytaj odpowiedź Bbuma. Ponadto przeczytaj moje podsumowanie.


atomic zawsze gwarantuje

  • jeśli dwie różne osoby chcą czytać i pisać w tym samym czasie, Twoja gazeta nie tylko spłonie! -- >Twoja aplikacja nigdy się nie zawiedzie, nawet w stanie wyścigowym.
  • jeśli jedna osoba próbuje pisać i napisała tylko 4 z 8 liter do napisania, to żadna nie może czytać w środku, odczyt moĹźe byÄ ‡ dokonany tylko wtedy, gdy wszystkie 8 liter zostanie zapisanych --> nie dojdzie do odczytu (get) w' wątku, ktĂłry wciÄ ... Ĺź pisze', tzn. jeĹ " li jest 8 bajtăłw do zapisania, a tylko 4 bajty sÄ ... zapisywane--do tego momentu nie wolno z niego czytać. Ale skoro powiedziałem, że się nie zawiesi, to odczyta z wartości obiektu z autoreleased.
  • jeśli zanim napiszesz do ciebie wykasujesz to co było wcześniej napisane na papierze i wtedy ktoś chce Czytaj ty możesz nadal czytać. Jak? Będziesz czytać z czegoś podobnego do kosza na śmieci Mac OS ( ponieważ kosz na śmieci nie jest jeszcze w 100% erased...it ' s in a limbo) - - - > If ThreadA is to read while ThreadB has already dealocated to write, you would get a value from either fully written value by ThreadB or get something from autorelease pool.

Liczba zatrzymań to sposób zarządzania pamięcią w Objective-C. Podczas tworzenia obiektu, posiada on policz do 1. Kiedy wysyłasz obiekt zachowuje komunikat, jego liczba zatrzymań jest zwiększana o 1. Kiedy wysyłasz obiektowi komunikat o zwolnieniu, jego liczba zatrzymań jest zmniejszana do 1. Kiedy wysyłasz obiekt wiadomość autorelease , jego liczba zatrzymań jest zmniejszana o 1 na pewnym etapie w przyszłości. Jeżeli obiekt zachowuje liczba jest zmniejszona do 0, jest dealokowana.

  • Atomic nie gwarantuje bezpieczeństwa wątku, chociaż jest przydatny do osiągnięcia bezpieczeństwa wątku. Bezpieczeństwo wątku zależy od tego, jak piszesz kod/ z której kolejki wątków czytasz/piszesz. Gwarantuje to jedynie niezniszczalne wielowątkowość.

Co?! Czy wielowątkowość i bezpieczeństwo wątków są różne?

Tak. Wielowątkowość oznacza: wiele wątków może odczytać udostępniony fragment danych w tym samym czasie i nie ulegniemy awarii, ale nie gwarantuje to, że nie czytasz z nieautoryzowanej wartości. Dzięki bezpieczeństwu gwintu jest to gwarantowane że to, co czytasz, nie jest automatycznie uwalniane. Powodem, dla którego nie robimy wszystkiego atomowego domyślnie jest to, że istnieje koszt wydajności i dla większości rzeczy tak naprawdę nie potrzebują bezpieczeństwa wątku. Kilka części naszego kodu tego potrzebuje, a dla tych kilku części, musimy napisać nasz kod w bezpieczny dla wątku sposób za pomocą zamków, mutex lub synchronizacji.

nonatomic

  • ponieważ nie ma czegoś takiego jak kosz na śmieci Mac OS, nikt nie dba o to, czy zawsze masz wartość ( nie gwarantuje, że nie dojdzie do awarii, ponieważ nie używa mechanizmu autorelease.
  • nie gwarantuje pełnego odczytu wartości pisanych!
  • jest szybszy niż atomic

Ogólnie różnią się w 2 aspektach:

  • Upaść lub nie z powodu posiadania lub nie posiadania puli autorelease.

  • Pozwala na odczyt w samym środku 'not yet finished write or empty value' lub nie pozwala i pozwala na odczyt tylko wtedy, gdy wartość jest w pełni zapisana.

 10
Author: Honey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-06-17 13:29:04

Jeśli używasz swojej właściwości w kodzie wielowątkowym, będziesz w stanie zobaczyć różnicę między atrybutami nieatomowymi i atomowymi. Nonatomic jest szybszy od atomic i atomic jest bezpieczny dla nici, a nie nonatomic.

Vijayendra Tripathi dał już przykład dla środowiska wielowątkowego.

 9
Author: Ankul Gaur,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-31 17:39:04
  • -Atomic oznacza tylko jeden wątek dostęp do zmiennej(Typ statyczny).
  • -Atomic jest bezpieczny dla nici.
  • -ale jest powolny w wydajności

Jak zadeklarować:

As atomic is default so,

@property (retain) NSString *name;

I w pliku implementacji

self.name = @"sourov";

Załóżmy, że zadanie związane z trzema właściwościami to

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

Wszystkie właściwości działają równolegle(jak asynchronicznie).

Jeśli wywołasz "name" Z wątku A ,

I

W tym samym czasie, jeśli zadzwonisz

[self setName:@"Datta"]

Z wątku B ,

Teraz jeśli właściwość * name jest nieatomowa , to

  • zwróci wartość "Datta" dla
  • zwróci wartość "Datta" dla B

to dlatego non atomic jest nazywany thread unsafe, ale jest szybki w wydajności ze względu na równoległe wykonanie

Teraz jeśli * nazwa właściwości jest atomic

  • zapewni wartość "Sourow" dla
  • wtedy zwróci wartość "Datta" dla B

dlatego atomic nazywa się thread Safe oraz dlatego nazywa się Bezpieczny odczyt i zapis

Taka operacja sytuacji będzie wykonywana seryjnie. i powolne działanie

- Nonatomic oznacza dostęp wielu wątków do zmiennej(Typ dynamiczny).

- Nonatomic is thread niebezpieczne.

- ale jest szybki w wydajności

-Nieatomowe nie jest domyślnym zachowaniem, musimy dodać nieatomowe słowo kluczowe w atrybucie właściwości.

Bo W Swift Potwierdzając, że właściwości Swift są nieatomowe w sensie ObjC. Jednym z powodów jest to, że zastanawiasz się, czy atomiczność nieruchomości jest wystarczająca dla Twoich potrzeb.

Numer referencyjny: https://forums.developer.apple.com/thread/25642

Fro więcej informacji proszę odwiedzić strona www http://rdcworld-iphone.blogspot.in/2012/12/variable-property-attributes-or.html

 9
Author: Shourob Datta,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-05 07:19:59

Atomicity atomic (domyślnie)

Atomic jest wartością domyślną: jeśli nic nie wpisujesz, twoja właściwość jest atomic. Własności atomowej jest gwarantowane, że jeśli spróbujesz odczytać z to, otrzymasz z powrotem ważną wartość. Nie daje żadnych gwarancji o tym, jaka może być ta wartość, ale odzyskasz dobre dane, a nie tylko śmieciowe wspomnienia. To, co pozwala Ci zrobić, to jeśli masz wiele wątków lub wielu procesów wskazujących na jedną zmienną, jeden wątek może czytać, a inny wątek może pisać. Jeśli uderzą w to samo czasu, wątek czytelnika ma gwarancję uzyskania jednej z dwóch wartości: albo przed zmianą, albo po zmianie. Czego atomic nie dać ci jest każdy rodzaj gwarancji, co do których z tych wartości można może być. Atomic jest bardzo często mylony z bezpiecznym, a to nie jest poprawne. Musisz zagwarantować bezpieczeństwo gwintu inne sposoby. Jednak atomic zagwarantuje, że jeśli spróbujesz przeczytać, dostajesz z powrotem jakąś wartość.

nieatomowe

Z drugiej strony, nieatomowe, jak można się domyślać, po prostu oznacza, "nie rób tych atomowych rzeczy."To, co tracisz, to gwarancja, że zawsze coś Odzyskaj. Jeśli spróbujesz przeczytać w środku napisz, możesz odzyskać dane śmieci. Ale z drugiej strony, idziesz trochę szybciej. Ponieważ właściwości atomowe muszą być magiczne aby zagwarantować, że otrzymasz z powrotem wartość, oni są trochę wolniejsze. Jeśli jest to nieruchomość, do której uzyskujesz dostęp, możesz chcieć upuścić aby upewnić się, że nie ponosisz tej prędkości kara. Access

Uprzejmość https://academy.realm.io/posts/tmi-objective-c-property-attributes/

Atrybuty właściwości Atomiczności (atomowe i nieatomiczne) nie są odzwierciedlone w odpowiedniej deklaracji właściwości Swift, ale Gwarancje atomiczności implementacji Objective-C nadal utrzymują gdy importowana właściwość jest dostępna z Swift.

Tak więc-jeśli zdefiniujesz właściwość atomową w Objective-C, pozostanie ona atomowa, gdy będzie używana przez Swift.

Uprzejmość https://medium.com/@YogevSitton/atomic-vs-non-atomic-properties-crash-course-d11c23f4366c

 8
Author: Suraj K Thomas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-07-01 08:01:02

Właściwość atomic zapewnia zachowanie w pełni zainicjalizowanej wartości niezależnie od tego, ile wątków wykonuje na niej getter & setter.

Właściwość nieatomowa określa, że zsyntetyzowane Accesory po prostu ustawiają lub zwracają wartość bezpośrednio, bez gwarancji co się stanie, jeśli ta sama wartość będzie dostępna jednocześnie z różnych wątków.

 5
Author: Laxman Sahni,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-10 14:15:51

Atomic oznacza, że tylko jeden wątek może uzyskać dostęp do zmiennej w czasie (Typ statyczny). Atomic jest bezpieczny dla nici, ale jest powolny.

Nonatomic oznacza, że wiele wątków może uzyskać dostęp do zmiennej w tym samym czasie (Typ dynamiczny). Nieatomowe jest niebezpieczne, ale szybkie.

 3
Author: Kemo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-10 14:16:37

Jeśli używasz atomic, oznacza to, że wątek będzie bezpieczny i tylko do odczytu. Jeśli używasz nonatomic, oznacza to, że wiele wątków uzyskuje dostęp do zmiennej i jest thread unsafe, ale jest on wykonywany szybko, wykonuje operacje odczytu i zapisu; jest to typ dynamiczny.

 1
Author: Preetha,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-10 14:18:07

Prawda jest taka, że używają spin Locka do implementacji własności atomowej. Kod jak poniżej:

 static inline void reallySetProperty(id self, SEL _cmd, id newValue, 
      ptrdiff_t offset, bool atomic, bool copy, bool mutableCopy) 
    {
        id oldValue;
        id *slot = (id*) ((char*)self + offset);

        if (copy) {
            newValue = [newValue copyWithZone:NULL];
        } else if (mutableCopy) {
            newValue = [newValue mutableCopyWithZone:NULL];
        } else {
            if (*slot == newValue) return;
            newValue = objc_retain(newValue);
        }

        if (!atomic) {
            oldValue = *slot;
            *slot = newValue;
        } else {
            spin_lock_t *slotlock = &PropertyLocks[GOODHASH(slot)];
            _spin_lock(slotlock);
            oldValue = *slot;
            *slot = newValue;        
            _spin_unlock(slotlock);
        }

        objc_release(oldValue);
    }
 1
Author: paul,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-09 05:04:23

Aby uprościć całe zamieszanie, pozwól nam zrozumieć blokadę mutex.

Mutex lock, zgodnie z nazwą, blokuje zmienność obiektu. Więc jeśli obiekt jest dostępny przez klasę, żadna inna klasa nie może uzyskać dostępu do tego samego obiektu.

W systemie iOS, @sychronise zapewnia również blokadę mutex .Teraz służy w trybie FIFO i zapewnia, że na przepływ nie mają wpływu dwie klasy współdzielące tę samą instancję. Jeśli jednak zadanie znajduje się w głównym wątku, unikaj dostępu do obiektu przy użyciu właściwości atomowych, ponieważ może on pomieścić twoje UI i obniżyć wydajność.

 0
Author: Suryanarayan Sahu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-12-14 00:36:16

Atomic: zapewnić bezpieczeństwo wątku, blokując wątek za pomocą NSLOCK.

Non atomic: nie zapewnia bezpieczeństwa gwintu, ponieważ nie ma mechanizmu blokującego gwint.

 -1
Author: satisharyan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-10 14:19:17

Atomic properties: - gdy zmienna przypisana do atomic properties, która oznacza, że ma tylko jeden dostęp do wątku i będzie bezpieczna dla wątku i będzie dobra w perspektywie wydajności, będzie miała domyślne zachowanie.

Non Atomic Properties: - gdy zmienna przypisana do atomic properties, która oznacza, że ma dostęp do wielu wątków i nie będzie bezpieczna dla wątku i będzie wolna w perspektywie wydajności, będzie miała domyślne zachowanie i gdy dwa różne wątki chcą zmienna dostępu w tym samym czasie da nieoczekiwane wyniki.

 -1
Author: ashish.surana,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-04 11:26:43