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, @synchronizedmenjamin 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 @synchronizeddirektif mencegah beberapa thread memasuki setiap wilayah kode yang dilindungi oleh @synchronizeddirektif mengacu pada objek yang sama . Objek yang diteruskan ke @synchronizeddirektif 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 nilsebagai 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 @synchronizeddirektif adalah cara yang nyaman untuk membuat kunci mutex dengan cepat di Objective-C code.
The @synchronizeddirektif 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.
@synchronizedadalah thread safemekanisme. Sepotong kode yang tertulis di dalam fungsi ini menjadi bagian critical sectiondarinya, yang hanya dapat dieksekusi oleh satu utas dalam satu waktu.
@synchronizemenerapkan kunci secara implisit sedangkan NSLockmenerapkannya 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.
@synchronizeddalamnya tidak melakukan apa-apa - Anda tidak terlindungi. 2)@synchronizedadalah lambat .