Jaki powinien być najlepszym sposobem w aplikacji iOS aby zapobiec instancję zmiennej przed zmianą przez przedmiot, podczas gdy inny używa go?
Dobra stara blokada, taka jak pthread_mutex
; można również użyć tego typu wrappera Objective-C (np. NSLock
i NSRecursiveLock
). @synchronized
również należy do tej kategorii, ale jest to mechanizm najwyższego poziomu wspomniany tutaj.
Oczywiście lepsze rozwiązania współbieżne zwykle mają więcej wspólnego ze zmianami w projekcie, przepływem programu, faworyzowaniem niezmienności i tak dalej. Wciąż będą przypadki, w których wzajemne wykluczenie/blokowanie jest preferowane lub wymagane.
Niestety, czysty ObjC/kakao jest bardzo mało w tej dziedzinie - opracowanie wysoce wydajnego równoległego programu przy użyciu technologii ObjC i kakao jest znacznie trudniejsze niż powinno być (lub musi być).
Czy użycie dyrektywy @synchronized (self) powinno być wystarczające?
Dla prostych przypadków jest wystarczająca. Jest to poziom obiektu Blokada rekursywna.
Jest jednak dość powolny w porównaniu z innymi opcjami wzajemnego wykluczania.
Nie sądzę @synchronized
ma wiele dzieje się za nim, oprócz:
- wygody dla deweloper wprowadzenie (może mieć złe skutki uboczne) i
- symetria (to zapewnia mecze odblokowujące blokada), znacznie zmniejszając prawdopodobieństwo zakleszczenia w porównaniu do alternatyw (bardzo dobry atrybut).
@synchronized
jest wygodne, ale dlatego, że ma wysokie koszty, należy stosować rozważnie.
to jest instancja var, a nie klasa var .. i nikt nie może powiedzieć ci rzetelnie podając tylko tę małą informację –
Czy to naprawdę dobry pomysł, aby edytować pytanie ("zmienna klasy" -> "instancja zmiennej"), jeśli jeden * myśli * to właśnie oznaczało PO? Odczytując poprzednie pytanie i odpowiedź, mogło to oznaczać, że miał na myśli "zmienną klasy". –
Przepraszam, moja wina, powiedziałbym "zmienną statyczną", jest to flaga, której wartość muszę udostępnić wszystkim instancjom klasy i upewnić się, że może ona zostać zmieniona tylko przez instancję w określonym czasie – AppsDev