Multithreading di Jawa

Mesin Maya Java menyokong pengkomputeran selari . Semua pengiraan boleh dilakukan dalam konteks satu atau lebih benang. Kami boleh menyediakan akses kepada sumber atau objek yang sama dengan mudah untuk berbilang utas, serta menyediakan utas untuk melaksanakan satu blok kod.

Mana-mana pembangun perlu menyegerakkan kerja dengan utas semasa operasi baca dan tulis untuk sumber yang mempunyai berbilang utas yang diperuntukkan kepada mereka.

Adalah penting bahawa semasa mengakses sumber anda mempunyai data terkini supaya urutan lain boleh mengubahnya dan anda mendapat maklumat terkini. Walaupun kita mengambil contoh akaun bank, sehingga wang itu sampai ke sana, anda tidak boleh menggunakannya, jadi penting untuk sentiasa mempunyai data terkini. Java mempunyai kelas khas untuk menyegerakkan dan mengurus benang.

Objek benang

Semuanya bermula dengan utas utama (utama), iaitu, sekurang-kurangnya program anda sudah mempunyai satu utas berjalan. Benang utama boleh membuat urutan lain menggunakan Boleh Dipanggil atau Boleh Dijalankan . Penciptaan berbeza hanya dalam hasil pulangan, Runnable tidak mengembalikan hasil dan tidak boleh membuang pengecualian yang ditandai. Oleh itu, anda mendapat peluang yang baik untuk membina kerja yang cekap dengan fail, tetapi ini sangat berbahaya dan anda perlu berhati-hati.

Ia juga mungkin untuk menjadualkan pelaksanaan benang pada teras CPU yang berasingan. Sistem boleh dengan mudah bergerak antara utas dan melaksanakan utas tertentu dengan tetapan yang betul: iaitu, utas yang membaca data dilaksanakan terlebih dahulu, sebaik sahaja kami mempunyai data, kemudian kami menyerahkannya kepada utas yang bertanggungjawab untuk pengesahan, selepas itu kami menghantarnya ke utas untuk melaksanakan beberapa logik perniagaan kemudian dan benang baru menulisnya kembali. Dalam keadaan sedemikian, 4 utas sedang memproses data secara bergilir-gilir dan semuanya akan berfungsi lebih cepat daripada satu utas. Setiap strim tersebut ditukar kepada strim OS asli, tetapi cara ia akan ditukar bergantung pada pelaksanaan JVM.

Kelas Thread digunakan untuk mencipta dan bekerja dengan benang. Ia mempunyai mekanisme kawalan standard, serta yang abstrak, seperti kelas dan koleksi daripada java.util.concurrent .

Penyegerakan Benang dalam Java

Komunikasi disediakan dengan berkongsi akses kepada objek. Ini sangat berkesan, tetapi pada masa yang sama ia sangat mudah untuk membuat kesilapan semasa bekerja. Ralat datang dalam dua kes: gangguan benang - apabila benang lain mengganggu benang anda, dan ralat konsistensi memori - konsistensi memori. Untuk menyelesaikan dan mencegah ralat ini, kami mempunyai kaedah penyegerakan yang berbeza.

Penyegerakan benang dalam Java dikendalikan oleh monitor, ini adalah mekanisme peringkat tinggi yang membenarkan hanya satu utas untuk melaksanakan blok kod yang dilindungi oleh monitor yang sama pada satu masa. Tingkah laku monitor dipertimbangkan dari segi kunci; satu monitor - satu kunci.

Penyegerakan mempunyai beberapa perkara penting yang perlu anda perhatikan. Perkara pertama ialah pengecualian bersama - hanya satu benang boleh memiliki monitor, oleh itu penyegerakan pada monitor membayangkan bahawa sebaik sahaja satu benang memasuki blok segerak yang dilindungi oleh monitor, tiada benang lain boleh memasuki blok yang dilindungi oleh monitor. monitor ini sehingga benang pertama keluar dari blok yang disegerakkan. Iaitu, berbilang benang tidak boleh mengakses blok disegerakkan yang sama pada masa yang sama.

Tetapi penyegerakan bukan sahaja pengecualian bersama. Penyegerakan memastikan bahawa data yang ditulis pada ingatan sebelum atau dalam blok yang disegerakkan menjadi kelihatan kepada benang lain yang disegerakkan pada monitor yang sama. Selepas keluar dari blok, kami melepaskan monitor dan benang lain boleh merebutnya dan mula melaksanakan blok kod ini.

Apabila benang baharu menangkap monitor, kami mendapat akses dan keupayaan untuk melaksanakan blok kod itu, dan pada ketika itu pembolehubah akan dimuatkan daripada memori utama. Kemudian kita boleh melihat semua entri yang dibuat dapat dilihat oleh keluaran monitor sebelumnya.

Baca-tulis pada medan ialah operasi atom jika medan itu sama ada diisytiharkan tidak menentu atau dilindungi oleh kunci unik yang diperoleh sebelum sebarang baca-tulis. Tetapi jika anda masih menghadapi ralat, maka anda mendapat ralat tentang menyusun semula (menukar pesanan, menyusun semula). Ia memanifestasikan dirinya dalam program berbilang benang yang disegerakkan secara tidak betul, di mana satu utas dapat melihat kesan yang dihasilkan oleh utas lain.

Kesan pengecualian bersama dan penyegerakan benang, iaitu, operasi betul mereka dicapai hanya dengan memasukkan blok disegerakkan atau kaedah yang secara tersirat memperoleh kunci, atau dengan mendapatkan kunci secara eksplisit. Kami akan membincangkannya di bawah. Kedua-dua cara bekerja mempengaruhi ingatan anda dan adalah penting untuk tidak melupakan bekerja dengan pembolehubah yang tidak menentu .

Medan tidak menentu di Jawa

Jika pembolehubah ditandakan tidak menentu , ia tersedia di seluruh dunia. Ini bermakna jika benang mengakses pembolehubah yang tidak menentu , ia akan mendapat nilainya sebelum menggunakan nilai daripada cache.

Tulisan berfungsi seperti keluaran monitor, dan bacaan berfungsi seperti tangkapan monitor. Akses dijalankan dalam hubungan jenis "dilakukan sebelum ini". Jika anda memikirkannya, semua yang akan kelihatan kepada utas A apabila ia mengakses pembolehubah tidak menentu ialah pembolehubah untuk utas B. Iaitu, anda dijamin tidak kehilangan perubahan anda daripada utas lain.

Pembolehubah yang tidak menentu adalah atom, iaitu, apabila membaca pembolehubah sedemikian, kesan yang sama digunakan seperti apabila mendapatkan kunci - data dalam ingatan diisytiharkan tidak sah atau tidak betul, dan nilai pembolehubah yang tidak menentu dibaca sekali lagi dari ingatan . Apabila menulis, kesan pada ingatan digunakan, serta apabila melepaskan kunci - medan yang tidak menentu ditulis ke ingatan.

Java Serentak

Jika anda ingin membuat aplikasi yang sangat cekap dan berbilang benang, anda mesti menggunakan kelas daripada perpustakaan JavaConcurrent , yang terdapat dalam pakej java.util.concurrent .

Perpustakaan ini sangat besar dan mempunyai fungsi yang berbeza, jadi mari kita lihat apa yang ada di dalamnya dan bahagikannya kepada beberapa modul:

Java Serentak

Koleksi Serentak ialah satu set koleksi untuk bekerja dalam persekitaran berbilang benang. Daripada pembungkus asas Collections.synchronizedList dengan menyekat akses kepada keseluruhan koleksi, kunci digunakan pada segmen data atau algoritma tanpa menunggu digunakan untuk membaca data secara selari.

Baris gilir - tidak menyekat dan menyekat baris gilir untuk bekerja dalam persekitaran berbilang benang. Barisan gilir tanpa sekatan memfokuskan pada kelajuan dan operasi tanpa menyekat benang. Menyekat baris gilir sesuai untuk kerja apabila anda perlu "memperlahankan" urutan Pengeluar atau Pengguna . Sebagai contoh, dalam keadaan di mana beberapa syarat tidak dipenuhi, barisan kosong atau penuh, atau tiada Pengguna 'a percuma.

Penyegerak ialah utiliti utiliti untuk menyegerakkan benang. Mereka adalah senjata ampuh dalam pengkomputeran "selari".

Pelaksana ialah rangka kerja untuk penciptaan kumpulan benang yang lebih mudah dan mudah, adalah mudah untuk menyediakan penjadualan tugas tak segerak dengan mendapatkan hasil.

Kunci ialah banyak mekanisme penyegerakan benang yang fleksibel berbanding dengan asas disegerakkan , tunggu , maklumkan , maklumkanSemua .

Atom ialah kelas yang boleh menyokong operasi atom pada primitif dan rujukan.