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.
Odpowiedzi:
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
.
Z dokumentacji Apple tutaj i tutaj :
Dyrektywa @synchronized to wygodny sposób na tworzenie blokad mutex w locie w kodzie Objective-C. Dyrektywa @synchronized robi to samo, co każda inna blokada mutex - uniemożliwia różnym wątkom uzyskanie tej samej blokady w tym samym czasie.
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.
@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 ...
@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?
Doskonała odpowiedź tutaj:
Pomóż w zrozumieniu metody klasy zwracającej singleton
z dalszym wyjaśnieniem procesu tworzenia singletona.
@synchronized
jest thread 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 gdy NSLock
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.
@synchronized
nim wskaźnika zerowego , nic nie da - pozostaniesz bez ochrony. 2)@synchronized
jest powolny .