Setiap kali sebuah pertanyaan muncul di SO tentang sinkronisasi Java, beberapa orang sangat ingin menunjukkan bahwa synchronized(this)
harus dihindari. Sebaliknya, mereka mengklaim, kunci pada referensi pribadi lebih disukai.
Beberapa alasan yang diberikan adalah:
- beberapa kode jahat dapat mencuri kunci Anda (sangat populer yang ini, juga memiliki varian "tidak sengaja")
- semua metode yang disinkronkan dalam kelas yang sama menggunakan kunci yang sama persis, yang mengurangi throughput
- Anda (tidak perlu) mengekspos terlalu banyak informasi
Orang lain, termasuk saya, berpendapat bahwa synchronized(this)
ini adalah ungkapan yang banyak digunakan (juga di perpustakaan Jawa), aman dan dipahami dengan baik. Seharusnya tidak dihindari karena Anda memiliki bug dan Anda tidak memiliki petunjuk tentang apa yang terjadi di program multithreaded Anda. Dengan kata lain: jika itu berlaku, maka gunakanlah.
Saya tertarik melihat beberapa contoh dunia nyata (tidak ada hal foobar) di mana menghindari kunci this
lebih disukai ketika synchronized(this)
juga akan melakukan pekerjaan.
Karena itu: haruskah Anda selalu menghindari synchronized(this)
dan menggantinya dengan kunci pada referensi pribadi?
Beberapa info lebih lanjut (diperbarui saat jawaban diberikan):
- kita berbicara tentang sinkronisasi contoh
- baik implisit (
synchronized
metode) dan bentuk eksplisitsynchronized(this)
dianggap - jika Anda mengutip Bloch atau otoritas lain tentang masalah ini, jangan tinggalkan bagian yang tidak Anda sukai (mis. Java Efektif, item tentang Keamanan Thread: Biasanya itu adalah kunci pada instance itu sendiri, tetapi ada pengecualian.)
- jika Anda membutuhkan rincian dalam penguncian selain dari
synchronized(this)
penyediaan, makasynchronized(this)
tidak berlaku sehingga tidak menjadi masalah