Az önce bir singleton metodu oluşturdum ve @synchronized()
sık kullandığım ama anlamını bilmediğim için fonksiyonun ne yaptığını bilmek istiyorum .
Yanıtlar:
Kod bloğu etrafında kritik bir bölüm bildirir . Çok iş parçacıklı kodda, @synchronized
herhangi bir zamanda blokta yalnızca bir iş parçacığının bu kodu çalıştırabileceğini garanti eder.
Ne yaptığının farkında değilseniz, o zaman uygulamanız muhtemelen çok iş parçacıklı değildir ve muhtemelen kullanmanız gerekmez (özellikle de tekil iş parçacığı güvenli değilse).
Düzenleme: 2011'deki orijinal cevapta olmayan bazı bilgiler ekleniyor.
@synchronized
Yönergesi bir ile korunmaktadır kod herhangi bir bölgeye girmesini birden fazla konu engeller @synchronized
direktifi aynı nesneye atıfta . Yönergeye iletilen @synchronized
nesne, "kilit" olarak kullanılan nesnedir. Kilit olarak farklı bir nesne kullanılıyorsa, iki iş parçacığı aynı korumalı kod bölgesinde olabilir ve kilitle aynı nesneyi kullanarak tamamen farklı iki kod bölgesini de koruyabilirsiniz.
Ayrıca, nil
kilit nesnesi olarak geçerseniz , hiçbir kilit alınmayacaktır.
@synchronized
.
Buradaki ve buradaki Apple belgelerinden :
@Synchronized yönergesi, Objective-C kodunda anında muteks kilitler oluşturmanın uygun bir yoludur. @Synchronized yönergesi diğer herhangi bir muteks kilidinin yapacağını yapar — farklı evrelerin aynı anda aynı kilidi edinmesini engeller.
Belgeler, bu konu hakkında zengin bilgi sağlar. Okumak için zaman ayırmaya değer, özellikle de ne yaptığını bilmeden kullandığınız göz önüne alındığında.
@synchronized
Direktifi içinde anında muteksin kilitleri oluşturmak için uygun bir yoldur Objective-C kodu.
@synchronized
Yönerge-do herhangi başka muteks kilidi ne yapar aynı anda aynı kilidi alınıyor farklı konuları engeller.
Sözdizimi:
@synchronized(key)
{
// thread-safe code
}
Misal:
-(void)AppendExisting:(NSString*)val
{
@synchronized (oldValue) {
[oldValue stringByAppendingFormat:@"-%@",val];
}
}
Şimdi yukarıdaki kod tamamen iş parçacığı güvenlidir .. Şimdi Birden çok iş parçacığı değeri değiştirebilir.
Yukarıdakiler sadece belirsiz bir örnek ...
@synchronized(val, oldValue) { ... }
?
@synchronized block, sizin için otomatik olarak kilitleme ve kilit açma işlemlerini gerçekleştirir . @synchronize, senkronize etmek için kullandığınız nesneyle ilişkili örtük bir kilidiniz var. İşte bu konuyla ilgili çok bilgilendirici tartışma var, lütfen takip edin Objective-C'de @senkronize nasıl kilitlenir / kilidi açılır?
Burada mükemmel cevap:
Tekil döndüren sınıf yöntemini anlamaya yardımcı olun
bir singleton oluşturma sürecinin daha fazla açıklamasıyla.
@synchronized
olan thread safe
mekanizma. Bu işlevin içinde yazılan kod parçası,critical section
, aynı anda yalnızca bir iş parçacığının çalıştırılabileceği .
@synchronize
kilidi örtük olarak uygularken NSLock
açıkça uygular.
Sadece iplik güvenliğini garanti eder, bunu garanti etmez. Demek istediğim, arabanız için uzman bir şoför kiralamak, yine de arabanın bir kaza ile karşılaşmayacağını garanti etmiyor. Ancak olasılık en ufaktır.
@synchronized
hiçbir şey yapmaz - korumasız kalırsınız. 2)@synchronized
bir yavaş .