Saya baru saja membuat metode tunggal, dan saya ingin tahu apa fungsinya @synchronized()
, karena saya sering menggunakannya, tetapi tidak tahu artinya.
Jawaban:
Ini mendeklarasikan bagian kritis di sekitar blok kode. Dalam kode multithread, @synchronized
menjamin bahwa hanya satu utas yang dapat mengeksekusi kode itu di blok pada waktu tertentu.
Jika Anda tidak mengetahui fungsinya, maka aplikasi Anda mungkin tidak multithread, dan Anda mungkin tidak perlu menggunakannya (terutama jika singleton itu sendiri tidak aman untuk thread).
Edit: Menambahkan beberapa informasi lagi yang tidak ada dalam jawaban asli dari tahun 2011.
The @synchronized
direktif mencegah beberapa thread memasuki setiap wilayah kode yang dilindungi oleh @synchronized
direktif mengacu pada objek yang sama . Objek yang diteruskan ke @synchronized
direktif adalah objek yang digunakan sebagai "kunci". Dua utas dapat berada di wilayah kode terlindung yang sama jika objek yang berbeda digunakan sebagai kunci, dan Anda juga dapat menjaga dua wilayah kode yang sama sekali berbeda menggunakan objek yang sama sebagai kunci.
Juga, jika Anda kebetulan lewat nil
sebagai objek kunci, tidak ada kunci yang akan diambil sama sekali.
@synchronized
.
Dari dokumentasi Apple di sini dan di sini :
Direktif @synchronized adalah cara mudah untuk membuat kunci mutex dengan cepat dalam kode Objective-C. Direktif @synchronized melakukan apa yang akan dilakukan kunci mutex lainnya — ini mencegah utas yang berbeda memperoleh kunci yang sama pada waktu yang sama.
Dokumentasi memberikan banyak informasi tentang hal ini. Ada baiknya meluangkan waktu untuk membacanya, terutama mengingat Anda telah menggunakannya tanpa mengetahui apa fungsinya.
The @synchronized
direktif adalah cara yang nyaman untuk membuat kunci mutex dengan cepat di Objective-C code.
The @synchronized
direktif melakukan apa saja kunci mutex lain yang akan dilakukan-mencegah benang yang berbeda dari memperoleh kunci yang sama pada waktu yang sama.
Sintaksis:
@synchronized(key)
{
// thread-safe code
}
Contoh:
-(void)AppendExisting:(NSString*)val
{
@synchronized (oldValue) {
[oldValue stringByAppendingFormat:@"-%@",val];
}
}
Sekarang kode di atas benar-benar aman untuk utas .. Sekarang Beberapa utas dapat mengubah nilainya.
Di atas hanyalah contoh yang tidak jelas ...
@synchronized(val, oldValue) { ... }
?
@ blok tersinkronisasi secara otomatis menangani penguncian dan pembukaan kunci untuk Anda . @sinkronisasi Anda memiliki kunci implisit yang dikaitkan dengan objek yang Anda gunakan untuk menyinkronkan. Berikut adalah diskusi yang sangat informatif tentang topik ini, silakan ikuti Bagaimana cara @synchronized mengunci / membuka kunci di Objective-C?
Jawaban yang sangat bagus di sini:
Membantu memahami metode kelas yang mengembalikan singleton
dengan penjelasan lebih lanjut tentang proses pembuatan singleton.
@synchronized
adalah thread safe
mekanisme. Sepotong kode yang tertulis di dalam fungsi ini menjadi bagian critical section
darinya, yang hanya dapat dieksekusi oleh satu utas dalam satu waktu.
@synchronize
menerapkan kunci secara implisit sedangkan NSLock
menerapkannya secara eksplisit.
Ini hanya menjamin keamanan benang, bukan menjamin itu. Yang saya maksud adalah Anda menyewa seorang pengemudi ahli untuk mobil Anda, tetap saja itu tidak menjamin mobil tidak akan mengalami kecelakaan. Namun probabilitas tetap kecil.
@synchronized
dalamnya tidak melakukan apa-apa - Anda tidak terlindungi. 2)@synchronized
adalah lambat .