Właśnie stworzyłem metodę singleton i chciałbym wiedzieć, co @synchronized()
robi ta funkcja , ponieważ często jej używam, ale nie znam znaczenia.
źródło
Właśnie stworzyłem metodę singleton i chciałbym wiedzieć, co @synchronized()
robi ta funkcja , ponieważ często jej używam, ale nie znam znaczenia.
Deklaruje krytyczną sekcję wokół bloku kodu. W kodzie wielowątkowym @synchronized
gwarantuje, że tylko jeden wątek może wykonywać ten kod w bloku w danym momencie.
Jeśli nie jesteś świadomy tego, co robi, prawdopodobnie Twoja aplikacja nie jest wielowątkowa i prawdopodobnie nie musisz jej używać (zwłaszcza jeśli sam singleton nie jest bezpieczny dla wątków).
Edycja: dodanie dodatkowych informacji, których nie było w oryginalnej odpowiedzi z 2011 roku.
@synchronized
Dyrektywy zapobiega wielu nici z wejściem na obszar kodu, który jest zabezpieczony przez @synchronized
dyrektywę odnoszące się do tego samego obiektu . Obiekt przekazany do@synchronized
dyrektywy jest obiektem używanym jako „blokada”. Dwa wątki mogą znajdować się w tym samym chronionym regionie kodu, jeśli inny obiekt jest używany jako zamek, a także możesz chronić dwa zupełnie różne obszary kodu przy użyciu tego samego obiektu co zamek.
Ponadto, jeśli zdarzy ci się przejść nil
jako obiekt blokujący, zamek w ogóle nie zostanie przyjęty.
@synchronized
nim wskaźnika zerowego , nic nie da - pozostaniesz bez ochrony. 2)@synchronized
jest powolny .@synchronized
.Z dokumentacji Apple tutaj i tutaj :
Dokumentacja dostarcza wielu informacji na ten temat. Warto poświęcić trochę czasu na przeczytanie go, zwłaszcza biorąc pod uwagę, że używasz go, nie wiedząc, co robi.
źródło
@synchronized
Dyrektywa jest wygodnym sposobem na stworzenie MUTEX zamki w locie w Objective-C kodu.@synchronized
Dyrektywa robi to, co każda inna blokada mutex zrobi, to zapobiega różne wątki z nabycia tej samej blokady w tym samym czasie.Składnia:
@synchronized(key) { // thread-safe code }
Przykład:
-(void)AppendExisting:(NSString*)val { @synchronized (oldValue) { [oldValue stringByAppendingFormat:@"-%@",val]; } }
Teraz powyższy kod jest całkowicie bezpieczny dla wątków. Teraz wiele wątków może zmienić wartość.
Powyższe to tylko niejasny przykład ...
źródło
@synchronized(val, oldValue) { ... }
?@ Zsynchronizowany blok automatycznie obsługuje blokowanie i odblokowywanie za Ciebie . @synchronize masz niejawną blokadę skojarzoną z obiektem, którego używasz do synchronizacji. Oto bardzo pouczająca dyskusja na ten temat. Proszę śledzić. Jak @synchronized blokuje / odblokowuje w Objective-C?
źródło
Doskonała odpowiedź tutaj:
Pomóż w zrozumieniu metody klasy zwracającej singleton
z dalszym wyjaśnieniem procesu tworzenia singletona.
źródło
@synchronized
jestthread safe
mechanizmem. Fragment kodu zapisany w tej funkcji staje się częściącritical section
, do której może być wykonywany tylko jeden wątek naraz.@synchronize
stosuje blokadę niejawnie, podczas gdyNSLock
stosuje ją jawnie.Zapewnia tylko bezpieczeństwo nici, a nie gwarantuje tego. Chodzi mi o to, że wynajmujesz doświadczonego kierowcę do swojego samochodu, ale to nie gwarantuje, że samochód nie spotka się z wypadkiem. Jednak prawdopodobieństwo pozostaje najmniejsze.
źródło