Saya bertanya-tanya mana yang lebih baik dalam praktiknya dan mengapa?
Saya telah menemukan itu Lock
dan Condition
(dan concurrent
kelas baru lainnya ) hanyalah lebih banyak alat untuk kotak alat. Saya dapat melakukan hampir semua yang saya butuhkan dengan palu cakar saya yang lama ( synchronized
kata kunci), tetapi rasanya canggung untuk digunakan dalam beberapa situasi. Beberapa dari situasi yang canggung itu menjadi jauh lebih mudah setelah saya menambahkan lebih banyak alat ke dalam kotak alat saya: palu karet, palu ball-peen, prybar, dan beberapa pukulan paku. Namun , palu cakar saya yang lama masih melihat penggunaannya.
Saya tidak berpikir satu benar-benar "lebih baik" dari yang lain, tetapi masing-masing lebih cocok untuk masalah yang berbeda. Singkatnya, model sederhana dan sifat berorientasi lingkup synchronized
membantu melindungi saya dari bug dalam kode saya, tetapi keuntungan yang sama kadang-kadang menjadi hambatan dalam skenario yang lebih kompleks. Ini skenario yang lebih kompleks bahwa paket bersamaan dibuat untuk membantu mengatasi. Tetapi menggunakan konstruksi tingkat yang lebih tinggi ini memerlukan manajemen kode yang lebih eksplisit dan hati-hati.
===
Saya pikir JavaDoc melakukan pekerjaan yang baik untuk menggambarkan perbedaan antara Lock
dan synchronized
(penekanannya adalah milik saya):
Implementasi kunci menyediakan operasi penguncian yang lebih luas daripada yang bisa diperoleh dengan menggunakan metode dan pernyataan yang disinkronkan. Mereka memungkinkan penataan yang lebih fleksibel , mungkin memiliki sifat yang sangat berbeda, dan dapat mendukung beberapa objek Kondisi terkait .
...
Penggunaan metode disinkronkan atau pernyataan menyediakan akses ke kunci memantau implisit terkait dengan setiap objek, tetapi pasukan semua akuisisi kunci dan rilis terjadi dengan cara blok-terstruktur : ketika beberapa kunci yang diperoleh mereka harus dibebaskan dalam urutan yang berlawanan , dan semua kunci harus dilepaskan dalam lingkup leksikal yang sama di mana mereka diperoleh .
Meskipun mekanisme pelingkupan untuk metode dan pernyataan yang disinkronkan membuat program lebih mudah dengan kunci monitor , dan membantu menghindari banyak kesalahan pemrograman umum yang melibatkan kunci, ada saat-saat di mana Anda perlu bekerja dengan kunci dengan cara yang lebih fleksibel. Sebagai contoh, * * beberapa algoritma * untuk melintasi struktur data yang diakses secara bersamaan membutuhkan penggunaan "hand-over-hand" atau "penguncian rantai" : Anda memperoleh kunci simpul A, lalu simpul B, lalu lepaskan A dan dapatkan C, kemudian lepaskan B dan dapatkan D dan seterusnya. Implementasi antarmuka Kunci memungkinkan penggunaan teknik-teknik tersebut dengan memungkinkan kunci diperoleh dan dirilis dalam lingkup yang berbeda , danmemungkinkan beberapa kunci diperoleh dan dirilis dalam urutan apa pun .
Dengan peningkatan fleksibilitas ini muncul tanggung jawab tambahan . Tidak adanya penguncian terstruktur-blok menghilangkan pelepasan kunci secara otomatis yang terjadi dengan metode dan pernyataan yang tersinkronisasi. Dalam kebanyakan kasus, idiom berikut harus digunakan:
...
Ketika penguncian dan pembukaan kunci terjadi dalam cakupan yang berbeda , kehati-hatian harus diambil untuk memastikan bahwa semua kode yang dijalankan saat kunci dipegang dilindungi oleh try-akhirnya atau coba-tangkap untuk memastikan bahwa kunci dilepaskan ketika diperlukan.
Implementasi kunci memberikan fungsionalitas tambahan atas penggunaan metode dan pernyataan yang disinkronkan dengan memberikan upaya non-pemblokiran untuk mendapatkan kunci (tryLock ()), upaya untuk mendapatkan kunci yang dapat terganggu (lockInterruptibly (), dan upaya untuk memperoleh kunci yang dapat habis (tryLock (panjang, TimeUnit)).
...