Co oznaczają atomic
i co nonatomic
oznaczają deklaracje majątkowe?
@property(nonatomic, retain) UITextField *userName;
@property(atomic, retain) UITextField *userName;
@property(retain) UITextField *userName;
Jaka jest różnica operacyjna między tymi trzema?
ios
objective-c
properties
atomic
nonatomic
Alex Wayne
źródło
źródło
Odpowiedzi:
Dwa ostatnie są identyczne; „atomowy” jest domyślnym zachowaniem (
zwróć uwagę, że tak naprawdę nie jest słowem kluczowym; jest określone tylko przez brak-nonatomic
atomic
został dodany jako słowo kluczowe w najnowszych wersjach llvm / clang).Zakładając, że @syntetyzujesz implementacje metod, atomowa vs. nieatomowa zmienia generowany kod. Jeśli piszesz własny setter / getters, atomowe / nieatomowe / zachowaj / przypisuj / kopiuj są jedynie wskazówkami. (Uwaga: @synthesize jest teraz domyślnym zachowaniem w najnowszych wersjach LLVM. Nie ma również potrzeby deklarowania zmiennych instancji; zostaną one również zsyntetyzowane automatycznie i będą
_
poprzedzone swoją nazwą, aby zapobiec przypadkowemu bezpośredniemu dostępowi).W przypadku „atomowej” zsyntetyzowany setter / getter zapewnia, że cała wartość jest zawsze zwracana z gettera lub ustawiana przez setter, niezależnie od aktywności setera w jakimkolwiek innym wątku. Oznacza to, że jeśli wątek A znajduje się w środku modułu pobierającego, podczas gdy wątek B wywołuje funkcję ustawiającą, rzeczywista wartość rzeczywista - obiekt automatycznie wydany, najprawdopodobniej - zostanie zwrócony do obiektu wywołującego w A.
W
nonatomic
nie udziela się takich gwarancji. Jest więcnonatomic
znacznie szybszy niż „atomowy”.To, czego nie robi „atom”, nie daje żadnych gwarancji bezpieczeństwa nici. Jeśli wątek A wywołuje getter jednocześnie z wątkiem B i C wywołującym setter z różnymi wartościami, wątek A może otrzymać jedną z trzech wartości - tę przed wywołaniem dowolnego settera lub jedną z wartości przekazanych do setterów w B i C. Podobnie, obiekt może otrzymać wartość z B lub C, co nie jest w stanie powiedzieć.
Zapewnienie integralności danych - jednego z głównych wyzwań programowania wielowątkowego - osiąga się innymi sposobami.
Dodając do tego:
atomicity
pojedynczej właściwości nie może również zagwarantować bezpieczeństwa wątku, gdy w grę wchodzi wiele zależnych właściwości.Rozważać:
W takim przypadku wątek A może zmienić nazwę obiektu przez wywołanie,
setFirstName:
a następnie wywołaniesetLastName:
. W międzyczasie wątek B może wywoływaćfullName
między dwoma wywołaniami wątku A i otrzyma nowe imię w połączeniu ze starym nazwiskiem.Aby rozwiązać ten problem, potrzebujesz modelu transakcyjnego . To znaczy jakiś inny rodzaj synchronizacji i / lub wykluczenia, który pozwala wykluczyć dostęp
fullName
podczas aktualizacji właściwości zależnych.źródło
@property NSArray* astronomicalEvents;
listę, która wyświetla dane, które chcę wyświetlić w interfejsie użytkownika. Gdy aplikacja uruchamia wskaźnik wskazuje pustą tablicę, aplikacja pobiera dane z Internetu. Po zakończeniu żądania WWW (w innym wątku) aplikacja buduje nową tablicę, a następnie atomowo ustawia właściwość na nową wartość wskaźnika. Jest bezpieczny dla wątków i nie musiałem pisać kodu blokującego, chyba że coś mi brakuje. Wydaje mi się bardzo przydatny.atomic
zapobiega odczytom połowy wartości wątku poprzecznego. (To był fajny błąd do wyśledzenia.)retain/autorelease
tańca. Wątek B zwalnia obiekt. Wątek A rozkwita .atomic
zapewnia, że wątek A ma silne odniesienie (wartość zatrzymania +1) dla wartości zwracanej.Wyjaśnia to dokumentacja Apple , ale poniżej znajdują się przykłady tego, co się faktycznie dzieje.
Zauważ, że nie ma słowa kluczowego „atomowy”, jeśli nie określisz „nieatomowy”, wówczas właściwość jest atomowa, ale jawne określenie „atomowy” spowoduje błąd.Jeśli nie określisz „nonatomic”, wówczas właściwość jest atomowa, ale nadal możesz jawnie określić „atomowy” w najnowszych wersjach, jeśli chcesz.
Teraz wariant atomowy jest nieco bardziej skomplikowany:
Zasadniczo wersja atomowa musi wziąć blokadę, aby zagwarantować bezpieczeństwo wątku, a także zwiększa liczbę referencji na obiekcie (i liczbę automatycznych wydań, aby go zrównoważyć), aby zagwarantować istnienie obiektu dla wywołującego, w przeciwnym razie jest potencjalnym stanem wyścigu, jeśli inny wątek ustawia wartość, powodując spadek liczby referencji do 0.
W rzeczywistości istnieje wiele różnych wariantów tego, jak te rzeczy działają, w zależności od tego, czy właściwości są wartościami skalarnymi, czy obiektami oraz od tego, jak zachowują, kopiują, tylko do odczytu, nieatomowe itp. Ogólnie rzecz biorąc, syntezatory właściwości po prostu wiedzą, jak zrobić „właściwą rzecz” dla wszystkich kombinacji.
źródło
@property (assign) id delegate;
nie jest zsynchronizowany na niczym (iOS SDK GCC 4.2 ARM-Os
), co oznacza, że istnieje wyścig pomiędzy[self.delegate delegateMethod:self];
ifoo.delegate = nil; self.foo = nil; [super dealloc];
. Zobacz stackoverflow.com/questions/917884/…_val
/val
są, ale nie, nie bardzo. Moduł pobierający dla atomucopy
/retain
właściwości musi upewnić się, że nie zwróci obiektu, którego licznik staje się zerowy, ponieważ setter jest wywoływany w innym wątku, co zasadniczo oznacza, że musi odczytać ivar, zachować go, jednocześnie upewniając się, że setter nie nadpisał i wydał go, a następnie automatycznie wydał, aby zrównoważyć zatrzymanie. Zasadniczo oznacza to, że zarówno moduł pobierający, jak i ustawiający musi używać blokady (jeśli układ pamięci został naprawiony, powinno to być wykonalne za pomocą instrukcji CAS2; niestety-retain
jest to wywołanie metody).Atomowy
Bezatomowy
źródło
Najlepszym sposobem na zrozumienie różnicy jest użycie następującego przykładu.
Załóżmy, że istnieje właściwość ciągu atomowego o nazwie „nazwa”, a jeśli wywołujesz
[self setName:@"A"]
z wątku A, wywołujesz[self setName:@"B"]
z wątku B i wywołujesz[self name]
z wątku C, wówczas wszystkie operacje na różnych wątkach będą wykonywane szeregowo, co oznacza, że jeśli jeden wątek wykonuje setter lub getter, wtedy inne wątki będą czekać.To sprawia, że właściwość „nazwa” odczytuje / zapisuje bezpiecznie, ale jeśli inny wątek, D, wywołuje
[name release]
jednocześnie, to ta operacja może spowodować awarię, ponieważ nie jest tu zaangażowane wywołanie 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 wiadomości dowolnego typu. Deweloper powinien zapewnić bezpieczeństwo wątków dla takich obiektów.Jeśli właściwość „name” była nieatomowa, wówczas wszystkie wątki w powyższym przykładzie - A, B, C i D wykonają się jednocześnie, dając dowolny nieprzewidywalny wynik. W przypadku atomu, jeden z A, B lub C wykona się jako pierwszy, ale D może nadal wykonać równolegle.
źródło
Składnia i semantyka są już dobrze zdefiniowane przez inne doskonałe odpowiedzi na to pytanie. Ponieważ wykonanie i wydajność nie są szczegółowo opisane, dodam swoją odpowiedź.
Zawsze uważałem atom za domyślny dość ciekawy. Na poziomie abstrakcji, nad którym pracujemy, wykorzystanie właściwości atomowych dla klasy jako pojazdu w celu osiągnięcia 100% bezpieczeństwa wątków jest bardzo ważne. W przypadku naprawdę poprawnych programów wielowątkowych interwencja programisty jest prawie na pewno wymogiem. Tymczasem charakterystyki wydajności i wykonanie nie zostały jeszcze szczegółowo opisane. Przez lata pisząc kilka programów wielowątkowych,
nonatomic
cały czas deklarowałem swoje właściwości, ponieważ atom nie był sensowny w żadnym celu. Podczas dyskusji o szczegółach właściwości atomowych i nieatomowych to pytanie spowodowało, że pewne profilowanie napotkało 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)
tego przykładu - widziałem to jako powszechne źródło zamieszania. Implementacja tak naprawdę nie korzysta@synchronized(self)
; używa blokad spinowych na poziomie obiektu . Ilustracja Louisa jest dobra na ilustrację wysokiego poziomu używającą konstruktów, które wszyscy znamy, ale ważne jest, aby wiedzieć, że nie używa@synchronized(self)
.Kolejna różnica polega na tym, że właściwości atomowe będą zachowywać / zwalniać cykl obiektów w getterze.
Wydajność
Oto interesująca część: Wydajność wykorzystująca dostęp do właściwości atomowych w przypadkach bezspornych (np. Jednowątkowych) może być naprawdę bardzo szybka w niektórych przypadkach. W mniej niż idealnych przypadkach korzystanie z dostępu atomowego może kosztować ponad 20 razy więcej
nonatomic
. Podczas gdy sporna sprawa wykorzystująca 7 wątków była 44 razy wolniejsza dla trzy-bajtowej struktury (2,2 GHz Core i7 Quad Core, x86_64). Trzy bajtowa struktura jest przykładem bardzo wolnej właściwości.Interesująca uwaga dodatkowa: zdefiniowane przez użytkownika akcesoria trzy bajtowej struktury były 52 razy szybsze niż zsyntetyzowane akcesoria atomowe; lub 84% prędkości zsyntetyzowanych nieatomowych akcesoriów.
Przedmioty w spornych przypadkach mogą również przekroczyć 50 razy.
Ze względu na liczbę optymalizacji i odmian we wdrożeniach trudno jest zmierzyć rzeczywiste wpływy w tych kontekstach. Często możesz usłyszeć coś takiego: „Zaufaj, chyba że profilujesz i uważasz, że to problem”. Ze względu na poziom abstrakcji trudno jest zmierzyć rzeczywisty wpływ. Oczyszczanie 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 mieć duże znaczenie.
Cofnijmy się więc, nie skupiając się na implementacji dostępu do nieruchomości, uwzględnimy zwykłych podejrzanych, takich jak
objc_msgSend
, i zbadamy niektóre rzeczywiste wyniki wysokiego poziomu dla wielu wywołańNSString
gettera w przypadkach bezspornych (wartości w sekundach):Jak zapewne się domyślacie, aktywność / cykl liczenia referencji ma znaczący wkład w atomikę i pod ARC. Widać też większe różnice w spornych sprawach.
Chociaż zwracam szczególną uwagę na wydajność, nadal mówię, że Semantics First! . Tymczasem wydajność ma niski priorytet w wielu projektach. Jednak znajomość szczegółów wykonania i kosztów używanych technologii z pewnością nie zaszkodzi. Powinieneś używać technologii odpowiedniej do swoich potrzeb, celów i umiejętności. Mamy nadzieję, że pozwoli to zaoszczędzić kilka godzin porównań i pomoże w podejmowaniu lepszych decyzji przy projektowaniu programów.
źródło
NSString
nieśmiertelnym:-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%
- wyniki są dzisiaj trochę inne. Nie robiłem żadnych@synchronized
porównań.@synchronized
jest semantycznie inny i nie uważam tego za dobre narzędzie, jeśli masz nieprofesjonalne programy współbieżne. jeśli potrzebujesz prędkości, unikaj@synchronized
.Atomic = bezpieczeństwo wątku
Bezatomowy = Brak bezpieczeństwa wątku
Bezpieczeństwo wątku:
Zmienne instancji są bezpieczne dla wątków, jeśli zachowują się poprawnie przy dostępie z wielu wątków, niezależnie od planowania lub przeplatania wykonywania tych wątków przez środowisko wykonawcze i bez dodatkowej synchronizacji lub innej koordynacji ze strony kodu wywołującego.
W naszym kontekście:
Jeśli wątek zmienia wartość instancji, zmieniona wartość jest dostępna dla wszystkich wątków i tylko jeden wątek może zmieniać tę wartość naraz.
Gdzie używać
atomic
:jeśli zmienna instancji będzie dostępna w środowisku wielowątkowym.
Znaczenie
atomic
:Nie tak szybko, ponieważ
nonatomic
ponieważnonatomic
nie wymaga żadnej pracy watchdoga od środowiska uruchomieniowego.Gdzie używać
nonatomic
:Jeśli zmienna instancji nie zostanie zmieniona przez wiele wątków, możesz jej użyć. Poprawia wydajność.
źródło
Znalazłem całkiem dobrze umieścić wyjaśnienie właściwości atomowych i non-atomowych tutaj . Oto odpowiedni tekst z tego samego:
Ponieważ
atomic
zmienne nie może zostać przerwana, wartości zawarte w nich w każdym momencie jest (gwint blokowaniu) gwarancją nieuszkodzone , chociaż zapewnia tę blokadę gwintu utrudnia dostęp do nich wolniej.non-atomic
z drugiej strony zmienne nie dają takiej gwarancji, ale oferują luksus szybszego dostępu. Podsumowując, idź z,non-atomic
gdy wiesz, że do twoich zmiennych nie będzie można uzyskać dostępu przez wiele wątków jednocześnie i przyspieszyć.źródło
Po przeczytaniu tylu artykułów, wpisów o przepełnieniu stosu i tworzeniu aplikacji demonstracyjnych do sprawdzania atrybutów właściwości zmiennych, postanowiłem zebrać wszystkie informacje o atrybutach razem:
atomic
// Domyślnanonatomic
strong = retain
// Domyślnaweak = unsafe_unretained
retain
assign
// Domyślnaunsafe_unretained
copy
readonly
readwrite
// DomyślnaW artykule Zmienne atrybuty właściwości lub modyfikatory w iOS można znaleźć wszystkie wyżej wymienione atrybuty, a to zdecydowanie pomoże.
atomic
atomic
oznacza, że tylko jeden wątek uzyskuje dostęp do zmiennej (typ statyczny).atomic
jest bezpieczny dla wątków.atomic
jest domyślnym zachowaniemPrzykład:
nonatomic
nonatomic
oznacza dostęp do wielu wątków do zmiennej (typ dynamiczny).nonatomic
jest niebezpieczny dla wątków.nonatomic
NIE jest zachowaniem domyślnym. Musimy dodaćnonatomic
słowo kluczowe w atrybucie właściwości.Przykład:
źródło
Atomowy:
Atomic gwarantuje, że dostęp do nieruchomości zostanie przeprowadzony w sposób atomowy. Np. Zawsze zwraca w pełni zainicjowane obiekty, każde pobranie / zestaw właściwości w jednym wątku musi się zakończyć, zanim inny będzie mógł uzyskać do niego dostęp.
Jeśli wyobrażasz sobie następującą funkcję występującą jednocześnie w dwóch wątkach, możesz zobaczyć, dlaczego wyniki nie byłyby ładne.
Zalety: Zwrócenie w pełni zainicjowanych obiektów za każdym razem czyni najlepszy wybór w przypadku wielowątkowości.
Minusy: Uderzenie wydajności, sprawia, że wykonanie jest nieco wolniejsze
Bezatomowe:
W przeciwieństwie do Atomic, nie zapewnia on w pełni zainicjowanego zwrotu obiektu za każdym razem.
Plusy: wyjątkowo szybkie wykonanie.
Minusy: Szanse na wartość śmieci w przypadku wielowątkowości.
źródło
Najłatwiejsza odpowiedź na początek: nie ma różnicy między twoimi drugimi dwoma przykładami. Domyślnie akcesoria własności są atomowe.
Akcesorium atomowe w środowisku bez odśmiecania (tj. Podczas używania zachowaj / zwolnij / autorelease) użyje blokady, aby upewnić się, że inny wątek nie zakłóci prawidłowego ustawienia / pobrania wartości.
Zobacz sekcję „ Wydajność i wątkowanie ” w dokumentacji Apple Objective-C 2.0, aby uzyskać więcej informacji i inne uwagi podczas tworzenia aplikacji wielowątkowych.
źródło
Atom oznacza, że tylko jeden wątek uzyskuje dostęp do zmiennej (typ statyczny). Atomic jest bezpieczny dla wątków, ale działa wolno.
Nonatomic oznacza, że wiele wątków ma dostęp do zmiennej (typ dynamiczny). Nonatomic jest niebezpieczny dla nici, ale jest szybki.
źródło
Atomic jest bezpieczny dla wątków , jest wolny i zapewnia (nie jest gwarantowany) że podana jest tylko wartość zablokowana, bez względu na liczbę wątków próbujących uzyskać dostęp do tej samej strefy. Gdy używasz atomu, fragment kodu zapisany w tej funkcji staje się częścią sekcji krytycznej, do której jednocześnie może być wykonywany tylko jeden wątek.
Zapewnia to jedynie bezpieczeństwo wątku; nie gwarantuje tego.Mam na myśli to, że wynajmujesz kierowcę dla swojego samochodu, ale to nie gwarantuje, że samochód nie spotka wypadku. Jednak prawdopodobieństwo pozostaje najmniejsze.
Atomowy - nie można go rozbić, więc oczekuje się wyniku. Z nonatomic - gdy inny wątek uzyskuje dostęp do strefy pamięci, może ją zmodyfikować, więc wynik jest nieoczekiwany.
Kod rozmowy:
Atomic sprawia, że getter i setter właściwości są bezpieczne. na przykład, jeśli napisałeś:
jest bezpieczny dla wątków.
NIE jest bezpieczny dla wątków.
źródło
Nie ma takiego słowa kluczowego „atomowy”
Możemy użyć powyższych jak
Zobacz pytanie Przepełnienie stosu Występują problemy, jeśli używam @property (atomowy, zachowaj) NSString * myString .
źródło
Zobacz więcej tutaj: https://realm.io/news/tmi-objective-c-property-attributes/
źródło
Domyślnym jest
atomic
, to oznacza to robi kosztować wydajność przy każdym użyciu nieruchomości, ale jest to bezpieczne dla wątków. To, co robi Cel-C, ustawia blokadę, więc tylko rzeczywisty wątek może uzyskać dostęp do zmiennej, o ile tylko setter / getter jest wykonywany.Przykład z MRC właściwości z wewnętrznym ivar:
Te dwa ostatnie są takie same:
Z drugiej strony
nonatomic
nic nie dodaje do twojego kodu. Dlatego wątek jest bezpieczny tylko wtedy, gdy samodzielnie kodujesz mechanizm bezpieczeństwa.Słowa kluczowe wcale nie muszą być zapisywane jako pierwszy atrybut właściwości.
Nie zapominaj, że nie oznacza to, że cała nieruchomość jest bezpieczna dla wątków. Tylko wywołanie metody setter / getter jest. Ale jeśli użyjesz setera, a następnie gettera w tym samym czasie z 2 różnymi wątkami, może on również zostać zepsuty!
źródło
Zanim zaczniesz: musisz wiedzieć, że każdy obiekt w pamięci musi zostać zwolniony z pamięci, aby pojawił się nowy pisarz. Nie możesz po prostu pisać na czymś tak, jak na papierze. Państwo musi najpierw usunąć (dealloc) go, a następnie można napisać na nim. Jeśli w tej chwili usuwanie jest zakończone (lub w połowie wykonane) i nic jeszcze nie zostało zostało napisane (lub w połowie napisane), a Ty spróbujesz przeczytać, może to być bardzo problematyczne! Atomowa i nieatomowa pomoc w leczeniu tego problemu na różne sposoby.
Najpierw przeczytaj to pytanie, a następnie przeczytaj odpowiedź Bbum . Ponadto przeczytaj moje streszczenie.
atomic
ZAWSZE gwarantujeCo?! Czy wielowątkowość i bezpieczeństwo wątków są inne?
Tak. Wielowątkowość oznacza: wiele wątków może odczytywać udostępniony kawałek danych w tym samym czasie i nie ulegniemy awarii, ale nie gwarantuje to, że nie czytasz z wartości niepublikowanej ponownie. Bezpieczeństwo wątków gwarantuje, że to, co czytasz, nie jest automatycznie uwalniane. Powodem tego, że domyślnie nie robimy wszystkiego z atomu, jest to, że wiąże się to z obniżeniem wydajności i w większości przypadków tak naprawdę nie potrzebuje bezpieczeństwa wątków. Potrzebuje go kilka części naszego kodu, a dla tych kilku części musimy napisać nasz kod w sposób bezpieczny dla wątków, używając blokad, muteksu lub synchronizacji.
nonatomic
Ogólnie różnią się w 2 aspektach:
Awaria lub brak spowodowany posiadaniem lub brakiem puli autorelease.
Umożliwianie odczytu bezpośrednio w środku „jeszcze nieukończonego zapisu lub pustej wartości” lub niedozwolone i pozwalające na odczyt tylko wtedy, gdy wartość zostanie w pełni zapisana.
źródło
Jeśli używasz swojej właściwości w kodzie wielowątkowym, zobaczysz różnicę między atrybutami nieatomowymi i atomowymi. Nonatomowy jest szybszy niż atomowy, a atomowy jest bezpieczny dla nici, a nie nieatomowy.
Vijayendra Tripathi podała już przykład środowiska wielowątkowego.
źródło
Jak zadeklarować:
Ponieważ atom jest domyślny,
ORAZ w pliku implementacji
Załóżmy, że zadanie związane z trzema właściwościami to
Wszystkie właściwości działają równolegle (jak asynchronicznie).
Jeśli wywołasz „imię” z wątku A ,
I
W tym samym czasie, jeśli zadzwonisz
z wątku B ,
Teraz Jeśli właściwość * name jest niepatomowa, to
Dlatego non-atomowy nazywa się niebezpiecznym wątkiem. Ale jest szybki w działaniu ze względu na równoległe wykonywanie
Teraz Jeśli właściwość * name jest atomowa
Właśnie dlatego atom nazywa się Bezpieczny dla wątków i dlatego nazywa się Bezpieczny do odczytu i zapisu
Taka operacja sytuacyjna zostanie wykonana szeregowo. I powolny w działaniu
- Nonatomic oznacza dostęp do wielu wątków zmiennej (typ dynamiczny).
- Nonatomic jest niebezpieczny dla nici.
- ale działa szybko
-Nieatomowe NIE jest zachowaniem domyślnym, musimy dodać nieatomowe słowo kluczowe w atrybucie właściwości.
Dla In Swift Potwierdzenie, że właściwości Swift nie są anatomiczne w sensie ObjC. Jednym z powodów jest zastanowienie się, czy atomowość według właściwości jest wystarczająca dla twoich potrzeb.
Odniesienie: https://forums.developer.apple.com/thread/25642
Więcej informacji można znaleźć na stronie http://rdcworld-iphone.blogspot.in/2012/12/variable-property-attributes-or.html
źródło
atomic
jest bezpieczne dla wątków! Jest bardziej odporny na problemy z nitkami, ale nie jest bezpieczny. Po prostu zapewnia, że otrzymasz całą wartość, czyli „poprawną” wartość (poziom binarny), ale w żadnym wypadku nie zapewni, że jest to bieżąca i „poprawna” wartość dla Twojej logiki biznesowej (może to być wartość przeszła i nieważne z powodu logiki).Atomowość atomowa (domyślnie)
nieatomowy
dzięki uprzejmości https://academy.realm.io/posts/tmi-objective-c-property-attributes/
Atrybuty właściwości atomowości (atomowa i nieatomowa) nie są odzwierciedlone w odpowiedniej deklaracji właściwości Swift, ale gwarancje atomowości implementacji celu C nadal obowiązują, gdy do importowanej właściwości można uzyskać dostęp z Swift.
Tak więc - jeśli zdefiniujesz właściwość atomową w Celu C, pozostanie ona atomowa, gdy zostanie użyta przez Swift.
dzięki uprzejmości https://medium.com/@YogevSitton/atomic-vs-non-atomic-properties-crash-course-d11c23f4366c
źródło
Właściwość atomowa zapewnia zachowanie w pełni zainicjowanej wartości niezależnie od tego, ile wątków robi na niej getter i setter.
Właściwość nieatomowa określa, że zsyntetyzowane akcesoria po prostu ustawiają lub zwracają wartość bezpośrednio, bez żadnych gwarancji, co się stanie, jeśli ta sama wartość będzie dostępna jednocześnie z różnych wątków.
źródło
Atomowa oznacza, że tylko jeden wątek może uzyskać dostęp do zmiennej jednocześnie (typ statyczny). Atomic jest bezpieczny dla wątków, ale działa wolno.
Nonatomic oznacza, że wiele wątków może uzyskać dostęp do zmiennej w tym samym czasie (typ dynamiczny). Nonatomic jest niebezpieczny dla nici, ale jest szybki.
źródło
Jeśli używasz atomu, oznacza to, że wątek będzie bezpieczny i tylko do odczytu. Jeśli używasz nonatomic, oznacza to, że wiele wątków ma dostęp do zmiennej i jest niebezpiecznie wątek, ale jest wykonywany szybko, wykonuje operacje odczytu i zapisu; to jest typ dynamiczny.
źródło
Prawda jest taka, że używają blokady spinowej do implementacji własności atomowej. Kod jak poniżej:
źródło
Aby uprościć całe zamieszanie, zrozummy blokadę mutex.
Mutex lock, jak sama nazwa, blokuje zmienność obiektu. Jeśli więc obiekt ma dostęp do klasy, żadna inna klasa nie może uzyskać dostępu do tego samego obiektu.
W iOS
@sychronise
zapewnia również blokadę mutex. Teraz działa w trybie FIFO i zapewnia, że dwie klasy współużytkujące tę samą instancję nie wpływają na przepływ. Jeśli jednak zadanie jest w głównym wątku, unikaj uzyskiwania dostępu do obiektu za pomocą właściwości atomowych, ponieważ może on zawierać interfejs użytkownika i obniżyć wydajność.źródło
Atomowa: Zapewnij bezpieczeństwo wątku, blokując wątek za pomocą NSLOCK.
Bezatomowy: Nie zapewnia bezpieczeństwa wątku, ponieważ nie ma mechanizmu blokującego wątek.
źródło
Właściwości atomowe : - Gdy zmienna przypisana do właściwości atomowej, co oznacza, że ma dostęp tylko do jednego wątku i będzie bezpieczna dla wątków i będzie dobra z punktu widzenia wydajności, będzie miała domyślne zachowanie.
Właściwości nieatomowe: - Gdy zmienna przypisana do właściwości atomowej oznacza, że ma dostęp do wielu wątków i nie będzie bezpieczna dla wątków i będzie wolna w perspektywie wydajności, będzie zachowywać się domyślnie, a gdy dwa różne wątki będą chciały uzyskać dostęp do zmiennej w tym samym czasie da nieoczekiwane rezultaty.
źródło