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, @synchronizedherhangi 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.
@synchronizedYönergesi bir ile korunmaktadır kod herhangi bir bölgeye girmesini birden fazla konu engeller @synchronizeddirektifi aynı nesneye atıfta . Yönergeye iletilen @synchronizednesne, "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, nilkilit 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.
@synchronizedDirektifi içinde anında muteksin kilitleri oluşturmak için uygun bir yoldur Objective-C kodu.
@synchronizedYö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.
@synchronizedolan thread safemekanizma. 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.
@synchronizedhiçbir şey yapmaz - korumasız kalırsınız. 2)@synchronizedbir yavaş .