Sementara saya membaca sebuah makalah penelitian tentang konkurensi bernama Perangkat Lunak dan Revolusi Konkurensi ( versi html ). Saya menemukan garis berikut:
Sayangnya, meskipun kunci berfungsi, mereka menimbulkan masalah serius bagi pengembangan perangkat lunak modern. Masalah mendasar dengan kunci adalah bahwa kunci tidak dapat dikomposisikan . Anda tidak dapat mengambil dua potong kode berbasis kunci yang benar, menggabungkannya, dan tahu bahwa hasilnya masih benar. Pengembangan perangkat lunak modern bergantung pada kemampuan untuk menyusun pustaka ke dalam program yang lebih besar, dan karenanya merupakan kesulitan serius bahwa kita tidak dapat membangun komponen berbasis kunci tanpa memeriksa implementasinya.
Saya sedang berpikir, bagaimana Java menjamin concurrency yang dapat dikompilasi atau bahkan ada cara untuk menghasilkan skenario ini.
Dan bagaimana kita bisa menyinkronkan data di satu atau lebih perpustakaan? Dapatkah seorang programmer melakukannya dari programnya atau terserah perpustakaan untuk menyinkronkan sesuatu.
Jika tidak Java maka apakah ada bahasa lain yang menggunakan konkurensi berbasis kunci dan menjamin konkurensi gabungan?
Berikut ini juga diambil dari kertas yang sama:
Setidaknya ada tiga masalah utama dengan metode yang disinkronkan. Pertama, mereka tidak sesuai untuk tipe yang metodenya memanggil fungsi virtual pada objek lain (misalnya, Java's Vector dan .NET's SyncHashTable), karena memanggil kode pihak ketiga sambil memegang kunci membuka kemungkinan kebuntuan . Kedua, metode yang disinkronkan dapat melakukan terlalu banyak penguncian, dengan memperoleh dan melepaskan kunci pada semua instance objek, bahkan yang tidak pernah dibagikan di seluruh utas (biasanya mayoritas). Ketiga, metode yang disinkronkan juga dapat melakukan penguncian terlalu sedikit, dengan tidak menjaga keaslian ketika suatu program memanggil beberapa metode pada suatu objek atau pada objek yang berbeda. Sebagai contoh sederhana dari yang terakhir, pertimbangkan transfer perbankan: account1.Credit (jumlah); account2.Debit (jumlah) ...
Catatan: Kertas diterbitkan pada September 2005
Jawaban:
Itu bukan bahasa Jawa. Itu sifat kunci (mutex).
Ada beberapa cara yang lebih baik untuk mendapatkan konkurensi yang ditingkatkan sambil tetap menjamin kebenaran, cara-cara yang independen bahasa:
Semua teknik ini memungkinkan peningkatan konkurensi tanpa menggunakan kunci. Tak satu pun dari mereka bergantung pada bahasa Jawa secara khusus.
sumber
Seperti yang dikatakan artikel itu, tidak mungkin untuk menjamin kompabilitas ketika menggunakan kunci bersama dengan metode virtual (atau mekanisme serupa lainnya, seperti fungsi lewat sebagai parameter). Jika sepotong kode memiliki akses ke metode virtual yang berasal dari potongan kode lain dan keduanya berpotensi menggunakan kunci, maka untuk aman (yaitu tanpa risiko kebuntuan) menyusun dua potong kode, Anda perlu memeriksa kode sumber dari kedua.
Secara umum, tergantung pada pemrogram yang menggunakan perpustakaan untuk melakukan sinkronisasi. Dengan begitu, programmer mengetahui di mana semua kunci berada dan mereka dapat memastikan mereka tidak menemui jalan buntu.
Sekali lagi, intinya dari artikel ini adalah bahwa ini tidak mungkin.
sumber
Mekanisme penguncian tingkat rendah pada dasarnya tidak dapat dikomposisikan. Ini sebagian besar karena kunci mencapai di bawah dunia untuk memengaruhi mesin yang menjalankan instruksi.
Perpustakaan Java berikutnya telah menambahkan mekanisme tingkat yang lebih tinggi dan lebih tinggi untuk memastikan operasi multithreaded yang benar. Mereka melakukan ini dengan membatasi penggunaan
lock()
danvolatile
untuk keadaan yang diketahui dan terkendali tertentu. Sebagai contoh, implementasi antrian konkuren memiliki perilaku yang sangat terlokalisasi dan memungkinkan alasan tentang sebelum dan sesudah negara. Menggunakan mekanisme tingkat yang lebih tinggi berarti Anda perlu membaca lebih sedikit dari spesifikasi atau kode untuk memperbaikinya. Tapi, dan ini adalah besar tetapi, Anda masih perlu memahami model penguncian dari setiap subsistem dan bagaimana mereka berinteraksi satu sama lain. Juga, perubahan dalam Java untuk konkurensi setelah Java 5 hampir secara eksklusif terkait dengan perpustakaan dan bukan bahasa.Masalah utama dengan mekanisme penguncian apa pun adalah bahwa hal itu memengaruhi status dan beroperasi dalam domain waktu. Baik manusia maupun komputer tidak memiliki alasan yang baik tentang keadaan atau waktu. Ini adalah kemampuan untuk berpikir tentang nilai dan struktur yang memungkinkan ilmuwan komputer untuk membuat monad, hal pertama yang muncul di benak saya sehubungan dengan kompabilitas dalam suatu bahasa.
Yang paling dekat dengan kami adalah Mengkomunikasikan Proses Berurutan . Ini masih membutuhkan mekanisme tingkat tinggi, seperti kotak surat dan pengiriman pesan. Menurut pendapat saya yang sederhana, CSP masih tidak berurusan dengan sistem besar (target akhir dari perangkat lunak komposer) atau alasan berbasis waktu.
sumber
lock()
danvolatile
merupakan perincian utas atau sinkronisasi proses.Pertama-tama saya berterima kasih kepada semua anggota yang menjawab pertanyaan ini, terutama Robert Harvey yang jawabannya sangat dekat dengan saya.
Saya telah meneliti konsep konkurensi selama dua tahun dan menurut temuan saya, tidak ada bahasa yang memberikan jaminan bahwa konstruk konkurensinya komposable. Kode berjalan yang sangat baik menggunakan struktur data yang tidak dapat diubah dan STM juga dapat menghasilkan hasil yang tidak terduga karena di bawah kap, STM menggunakan kunci. STM sangat baik untuk operasi atom, tetapi jika kita berbicara tentang kompabilitas kontras konkurensi antara modul, ada kemungkinan (sangat sedikit) bahwa STM mungkin tidak berfungsi seperti yang diharapkan.
Tapi tetap saja, kita bisa meminimalkan ketidakpastian dengan menggunakan yang berikut (teknik / metode / konstruksi):
Memperbarui
Berkat Jules, saya berdiri terkoreksi. STM menggunakan berbagai implementasi dan kebanyakan dari mereka bebas dari penguncian. Tapi saya masih percaya bahwa STM adalah solusi yang baik di sini, tetapi bukan yang sempurna, dan memiliki kekurangan:
Lihat juga makalah ini:
Koran-koran ini berumur beberapa tahun. Banyak hal mungkin telah berubah / membaik tetapi tidak semua.
sumber
Saya telah mendengarnya mengatakan oleh para peneliti yang dihormati bahwa mekanisme sinkronisasi yang berguna dapat digunakan untuk membangun jalan buntu. Memori Transaksional (apakah perangkat keras atau perangkat lunak) tidak berbeda. Misalnya, pertimbangkan pendekatan ini untuk menulis penghalang utas:
(Catatan: contoh diambil dari kertas oleh Yannis Smaragdakis di PACT 2009)
Jika kita mengabaikan fakta bahwa ini bukan cara yang baik untuk menyinkronkan sejumlah besar utas, tampaknya itu benar. Tapi itu tidak komposable. Keputusan untuk memasukkan logika ke dalam dua transaksi sangat penting. Jika kita menyebutnya dari transaksi lain, sehingga semuanya diratakan menjadi satu transaksi, maka kita mungkin tidak akan pernah menyelesaikannya.
Hal yang sama berlaku untuk saluran yang lewat pesan: siklus komunikasi dapat menyebabkan kebuntuan. Sinkronisasi ad-hoc dengan atom C ++ dapat menyebabkan kebuntuan. RCU, kunci urutan, kunci pembaca / penulis, variabel kondisi, dan semafor dapat digunakan untuk membuat deadlock.
Itu tidak berarti bahwa transaksi atau saluran (atau kunci atau RCU) buruk. Sebaliknya, itu untuk mengatakan bahwa beberapa hal sepertinya tidak mungkin. Mekanisme kontrol konkurensi yang dapat diukur, dapat disusun, bebas patologi mungkin tidak memungkinkan.
Cara terbaik untuk menghindari masalah adalah tidak mencari mekanisme peluru perak, tetapi untuk menggunakan pola yang baik dengan seksama. Dalam dunia komputasi paralel, titik awal yang baik adalah Pemrograman Paralel Terstruktur: Pola Komputasi Efisien , oleh Arch Robison, James Reinders, dan Michael McCool. Untuk pemrograman bersamaan, ada beberapa pola yang bagus (lihat komentar @ gardenhead), tetapi programmer C ++ dan Java tidak akan menggunakannya. Satu pola yang lebih banyak orang dapat mulai menggunakan cara-cara yang benar adalah mengganti sinkronisasi ad-hoc dalam program-program dengan antrian multi-konsumen multi-produsen. Dan TM jelas lebih baik daripada kunci, karena meningkatkan tingkat abstraksi, sehingga pemrogram fokus pada apa yang perlu menjadi atom , bukanbagaimana menerapkan protokol kunci pintar untuk memastikan atomicity . Mudah-mudahan, ketika perangkat keras TM meningkat dan bahasa menambahkan lebih banyak dukungan TM, kita akan mencapai titik di mana TM mengganti kunci dalam kasus umum.
sumber