Multithreading di Jawa

Java Virtual Machine mendukung komputasi paralel . Semua perhitungan dapat dilakukan dalam konteks satu atau lebih utas. Kami dapat dengan mudah mengatur akses ke sumber daya atau objek yang sama untuk banyak utas, serta mengatur utas untuk mengeksekusi satu blok kode.

Pengembang mana pun perlu menyinkronkan pekerjaan dengan utas selama operasi baca dan tulis untuk sumber daya yang memiliki banyak utas yang dialokasikan untuknya.

Penting bahwa pada saat mengakses sumber daya Anda memiliki data terkini sehingga utas lain dapat mengubahnya dan Anda mendapatkan informasi terbaru. Kalaupun kita mengambil contoh rekening bank, sampai uang datang, Anda tidak dapat menggunakannya, jadi penting untuk selalu memiliki data yang up-to-date. Java memiliki kelas khusus untuk menyinkronkan dan mengelola utas.

Objek benang

Semuanya dimulai dengan utas utama (utama), yaitu setidaknya program Anda sudah memiliki satu utas yang berjalan. Utas utama dapat membuat utas lain menggunakan Callable atau Runnable . Penciptaan hanya berbeda dalam hasil pengembalian, Runnable tidak mengembalikan hasil dan tidak dapat melempar pengecualian yang dicentang. Oleh karena itu, Anda mendapat peluang bagus untuk membangun pekerjaan yang efisien dengan file, tetapi ini sangat berbahaya dan Anda perlu berhati-hati.

Dimungkinkan juga untuk menjadwalkan eksekusi thread pada inti CPU yang terpisah. Sistem dapat dengan mudah berpindah antar utas dan menjalankan utas tertentu dengan pengaturan yang tepat: yaitu, utas yang membaca data dieksekusi terlebih dahulu, segera setelah kami memiliki data, kemudian kami meneruskannya ke utas yang bertanggung jawab untuk validasi, setelah itu kami meneruskannya ke utas untuk menjalankan beberapa kemudian logika bisnis dan utas baru menulisnya kembali. Dalam situasi seperti itu, 4 utas sedang memproses data secara bergantian dan semuanya akan bekerja lebih cepat dari satu utas. Setiap aliran tersebut dikonversi ke aliran OS asli, tetapi cara konversinya bergantung pada implementasi JVM.

Kelas Thread digunakan untuk membuat dan bekerja dengan thread. Ini memiliki mekanisme kontrol standar, serta yang abstrak, seperti kelas dan koleksi dari java.util.concurrent .

Sinkronisasi Utas di Jawa

Komunikasi disediakan dengan berbagi akses ke objek. Ini sangat efektif, tetapi pada saat yang sama sangat mudah membuat kesalahan saat bekerja. Kesalahan datang dalam dua kasus: gangguan utas - saat utas lain mengganggu utas Anda, dan kesalahan konsistensi memori - konsistensi memori. Untuk mengatasi dan mencegah kesalahan ini, kami memiliki metode sinkronisasi yang berbeda.

Sinkronisasi utas di Java ditangani oleh monitor, ini adalah mekanisme tingkat tinggi yang memungkinkan hanya satu utas untuk mengeksekusi blok kode yang dilindungi oleh monitor yang sama pada satu waktu. Perilaku monitor dianggap sebagai kunci; satu monitor - satu kunci.

Sinkronisasi memiliki beberapa poin penting yang perlu Anda perhatikan. Poin pertama adalah pengecualian timbal balik - hanya satu utas yang dapat memiliki monitor, sehingga sinkronisasi pada monitor menyiratkan bahwa sekali satu utas memasuki blok tersinkronisasi yang dilindungi oleh monitor, tidak ada utas lain yang dapat memasuki blok yang dilindungi oleh monitor. utas pertama keluar dari blok yang disinkronkan. Artinya, banyak utas tidak dapat mengakses blok tersinkronisasi yang sama pada saat yang bersamaan.

Tetapi sinkronisasi bukan hanya pengecualian timbal balik. Sinkronisasi memastikan bahwa data yang ditulis ke memori sebelum atau di dalam blok yang disinkronkan dapat dilihat oleh utas lain yang disinkronkan pada monitor yang sama. Setelah keluar dari blok, kami melepaskan monitor dan utas lain dapat mengambilnya dan mulai menjalankan blok kode ini.

Ketika utas baru menangkap monitor, kami mendapatkan akses ke dan kemampuan untuk mengeksekusi blok kode itu, dan pada saat itu variabel akan dimuat dari memori utama. Kemudian kita dapat melihat semua entri yang ditampilkan oleh rilis monitor sebelumnya.

Baca-tulis pada bidang adalah operasi atomik jika bidang dinyatakan tidak stabil atau dilindungi oleh kunci unik yang diperoleh sebelum baca-tulis apa pun. Namun jika masih menemui error, maka anda mendapatkan error tentang reordering (mengubah urutan, reordering). Itu memanifestasikan dirinya dalam program multi-utas yang disinkronkan secara tidak benar, di mana satu utas dapat mengamati efek yang dihasilkan oleh utas lainnya.

Efek dari saling pengecualian dan sinkronisasi utas, yaitu operasi yang benar dicapai hanya dengan memasukkan blok atau metode yang disinkronkan yang secara implisit memperoleh kunci, atau dengan memperoleh kunci secara eksplisit. Kami akan membicarakannya di bawah. Kedua cara kerja tersebut memengaruhi memori Anda dan penting untuk tidak melupakan cara bekerja dengan variabel volatil .

Bidang volatil di Jawa

Jika sebuah variabel ditandai volatile , itu tersedia secara global. Artinya, jika utas mengakses variabel volatil , utas akan mendapatkan nilainya sebelum menggunakan nilai dari cache.

Penulisan berfungsi seperti rilis monitor, dan pembacaan berfungsi seperti tangkapan monitor. Akses dilakukan dalam relasi tipe "dilakukan sebelumnya". Jika Anda mengetahuinya, semua yang akan terlihat oleh utas A saat mengakses variabel volatil adalah variabel untuk utas B. Artinya, Anda dijamin tidak akan kehilangan perubahan dari utas lainnya.

Variabel volatil bersifat atomik, yaitu, saat membaca variabel seperti itu, efek yang sama digunakan seperti saat mendapatkan kunci - data dalam memori dinyatakan tidak valid atau salah, dan nilai variabel volatil dibaca lagi dari memori . Saat menulis, efek pada memori digunakan, serta saat melepaskan kunci - bidang volatil ditulis ke memori.

Serentak Jawa

Jika Anda ingin membuat aplikasi yang super efisien dan multi-utas, Anda harus menggunakan kelas dari pustaka JavaConcurrent , yang ada di paket java.util.concurrent .

Pustaka ini sangat banyak dan memiliki fungsi yang berbeda, jadi mari kita lihat apa yang ada di dalamnya dan membaginya menjadi beberapa modul:

Serentak Jawa

Koleksi Bersamaan adalah sekumpulan koleksi untuk bekerja di lingkungan multi-utas. Alih-alih Collections.synchronizedList pembungkus dasar dengan memblokir akses ke seluruh koleksi, kunci digunakan pada segmen data atau algoritme bebas tunggu digunakan untuk membaca data secara paralel.

Antrian - antrean non-pemblokiran dan pemblokiran untuk bekerja di lingkungan multi-utas. Antrean non-pemblokiran fokus pada kecepatan dan operasi tanpa memblokir utas. Antrean pemblokiran cocok untuk pekerjaan saat Anda perlu "memperlambat" utas Produser atau Konsumen . Misalnya, dalam situasi di mana beberapa kondisi tidak terpenuhi, antrian kosong atau penuh, atau tidak ada Konsumen 'a yang gratis.

Sinkronisasi adalah utilitas utilitas untuk menyinkronkan utas. Mereka adalah senjata ampuh dalam komputasi "paralel".

Pelaksana adalah kerangka kerja untuk pembuatan kumpulan utas yang lebih nyaman dan mudah, mudah untuk mengatur penjadwalan tugas asinkron dengan mendapatkan hasil.

Kunci adalah banyak mekanisme sinkronisasi utas yang fleksibel dibandingkan dengan sinkronisasi dasar, tunggu , beri tahu , beri tahu Semua .

Atomics adalah kelas yang dapat mendukung operasi atom pada primitif dan referensi.