Apa arti kode java ini? Apakah itu akan mengunci semua objek MyClass
?
synchronized(MyClass.class) {
//is all objects of MyClass are thread-safe now ??
}
Dan bagaimana kode di atas berbeda dari yang ini:
synchronized(this) {
//is all objects of MyClass are thread-safe now ??
}
java
multithreading
synchronization
locking
synchronized
Andrew Tobilko
sumber
sumber
Jawaban:
Cuplikan
synchronized(X.class)
menggunakan instance kelas sebagai monitor. Karena hanya ada satu instance kelas (objek yang mewakili metadata kelas pada waktu proses), satu utas dapat berada di blok ini.Dengan
synchronized(this)
blok tersebut dijaga oleh instance. Untuk setiap contoh, hanya satu utas yang dapat memasuki blok.synchronized(X.class)
digunakan untuk memastikan bahwa hanya ada satu Thread di blok.synchronized(this)
memastikan bahwa hanya ada satu utas per instance. Jika ini membuat kode sebenarnya di blok thread-aman tergantung pada implementasi. Jika status mutasi saja dari instancesynchronized(this)
sudah cukup.sumber
Untuk menambah jawaban lain:
setara dengan
dan
setara dengan
sumber
synchronized
blok. Itu membuat mereka setara. Jika Anda mengubah satu contoh, mereka memang tidak lagi sama.Tidak, yang pertama akan mengetahui definisi kelas dari
MyClass
, tidak semua instance-nya. Namun, jika digunakan dalam sebuah instance, ini akan secara efektif memblokir semua instance lainnya, karena mereka berbagi definisi kelas tunggal.Yang kedua akan mendapatkan kunci pada instance saat ini saja.
Mengenai apakah ini membuat objek thread Anda aman, itu adalah pertanyaan yang jauh lebih kompleks - kami perlu melihat kode Anda!
sumber
Ya, tentu saja.
Saya bertanya-tanya tentang pertanyaan ini selama beberapa hari untuk diri saya sendiri (sebenarnya di kotlin). Saya akhirnya menemukan penjelasan yang bagus dan ingin membagikannya:
Kunci tingkat kelas mencegah beberapa utas masuk dalam blok tersinkronisasi di salah satu dari semua contoh kelas yang tersedia pada waktu proses. Ini berarti jika dalam runtime ada 100 instance DemoClass, maka hanya satu thread yang dapat mengeksekusi demoMethod () di salah satu instance dalam satu waktu, dan semua instance lainnya akan dikunci untuk thread lain.
Penguncian tingkat kelas harus selalu dilakukan untuk membuat utas data statis aman. Seperti yang kita ketahui bahwa kata kunci statis mengasosiasikan data metode ke tingkat kelas, jadi gunakan penguncian pada bidang statis atau metode untuk membuatnya di tingkat kelas.
Baca lebih lanjut: https://howtodoinjava.com/java/multi-threading/object-vs-class-level-locking/
sumber