Apakah sudah waktunya untuk menghentikan sinkronisasi, menunggu dan memberi tahu?

13

Apakah ada skenario tunggal (selain kompatibilitas dengan JVM kuno) di mana menggunakan synchronizedlebih disukai daripada menggunakan Lock? Adakah yang bisa membenarkan menggunakan waitatau notifymelalui sistem yang lebih baru?

Adakah algoritma yang harus digunakan salah satunya dalam implementasinya?

Saya melihat pertanyaan sebelumnya yang menyentuh masalah ini tetapi saya ingin mengambil ini sedikit lebih jauh dan sebenarnya deprecatemereka. Ada terlalu banyak jebakan dan jebakan dan peringatan dengan mereka yang telah disetrika dengan fasilitas baru. Saya hanya merasa mungkin sudah saatnya untuk menandai mereka usang.

OldCurmudgeon
sumber
4
Sudahkah Anda membaca Java Concurrency dalam Praktek Brian Goetz? Dia mencakup perdebatan kunci implisit vs eksplisit baik di sana.
Martijn Verburg
@ MartijnVerburg - Sayangnya tidak, tetapi saya sangat menghormati pekerjaannya.
OldCurmudgeon
1
kata kunci yang disinkronkan mungkin berguna dengan metode statis sederhana yang seharusnya aman, untuk hal lain yang akan saya gunakan bersamaan. Tapi ini pendapat saya
Kemoda

Jawaban:

12

Adakah algoritma yang harus digunakan salah satunya dalam implementasinya?

Hampir pasti tidak. (Memang, dari perspektif teoritis, Anda harus dapat menunggu simulasi / Beritahu menggunakan java.util.concurrent lainnya. . Kelas. Dan disinkronisasi bisa diganti dengan operasi Lock eksplisit ... meskipun Anda akan perlu untuk berhati-hati untuk membuka di finallyklausa.)

Namun, mungkin ada algoritma di mana implementasi berkinerja terbaik di Jawa melibatkan penggunaan langsung disinkronkan, dengan atau tanpa menunggu dan memberi tahu.


Apakah sudah waktunya untuk menghentikan sinkronisasi, menunggu dan memberi tahu?

Terlepas dari jawaban atas pertanyaan sebelumnya, jawabannya pasti tidak.

Tunggu / beri tahu dapat (dan sering) digunakan dengan benar. Di Jawa, penghentian dicadangkan untuk kelas dan metode yang rusak; yaitu di mana penggunaan berkelanjutan harus diperbaiki sebagai masalah urgensi. Jika Sun (dan sekarang Oracle) mencabut sesuatu yang fundamental dan digunakan secara luas sebagai menunggu / memberi tahu, mereka akan menciptakan masalah kompatibilitas yang serius untuk sejumlah besar kode warisan. Itu BUKAN untuk kepentingan siapa pun.

Jika Anda ingin menyingkirkan sinkronisasi / tunggu / beri tahu dalam kode Anda, itu tidak masalah. Tetapi penghentian panggilan untuk penulisan ulang sejumlah besar kode multi-threaded benar dasarnya, dan itu akan menjadi BAD IDEA. Manajer TI perusahaan dan manajer produk perangkat lunak akan membenci Anda karena menyarankannya ...


Layak untuk membaca apa yang berarti "usang" sesuai dengan dokumentasi Java: http://docs.oracle.com/javase/1.5.0/docs/guide/javadoc/deprecation/deprecation.html

Dan juga perhatikan bahwa kita berbicara tentang hal-hal yang sudah ketinggalan zaman yang merupakan inti dari bahasa Jawa. Penghinaan synchronizedmemiliki konsekuensi besar.

Stephen C
sumber
Sebenarnya, sejauh yang saya ingat, menurut buku “Java concurrency in practice” yang sangat baik, java.util.concurrentkelas util sebenarnya lebih cepat. Di belakang layar, kelas-kelas ini langsung berbicara dengan VM, di mana ketika disinkronkan menginstal kunci tumpul pada objek dalam grafik objek dan dengan demikian berdampak pada kinerja global.
akuhn
Maafkan saya @Stephen jika saya menemukan bahwa kami benar-benar menghapus synchronizedet. Al. Saya hanya menyarankan penghentian, yang benar-benar hanya mengatakan jangan gunakan ini untuk kode baru. Saya tidak akan bermimpi menyarankan untuk merusak dan mencoba kode warisan saya menuntut penghapusan mereka.
OldCurmudgeon
@OldCurmudgeon - agak terlambat, tapi saya pikir penghinaan terlalu ekstrem. 1) Ini berarti fitur tersebut dapat dihapus. 2) Ini menyiratkan bahwa fitur ini rusak, berbeda dari sekadar kuno. 3) Banyak orang masih senang menulis kode baru seperti itu ... dan tidak ada alasan kuat bahwa mereka seharusnya tidak melakukannya. 4) Ada cara lain, kurang "di wajah Anda" untuk mencegahnya; misalnya menulis aturan PMD ...
Stephen C
@StephenC - Apakah ada tindakan yang sedikit kurang dramatis yang dapat kita ambil yang pada akhirnya akan membuat mereka tidak digunakan atau diajarkan di perguruan tinggi. Mereka jelas harus dihindari. Saya menduga aturan PMD - meskipun ide yang bagus - tidak akan mencapai guru dengan sangat cepat.
OldCurmudgeon
1
@StephenC A nitpick: pergi oleh Java docs Anda ditautkan, saya tidak berpikir penghentian berarti kode yang sudah usang rusak. Itulah salah satu alasannya, tetapi seperti yang dikatakan oleh dokumen, API dapat ditinggalkan ketika digantikan oleh API yang lebih baru dan lebih baik (seperti yang dikatakan OP, seperti halnya concurrency). Dan konkurensi tingkat rendah, jika tidak benar-benar mendorong praktik buruk, tentu sangat rawan kesalahan.
Andres F.