Multithreading ing Jawa

Java Virtual Machine ndhukung komputasi paralel . Kabeh petungan bisa dileksanakake ing konteks siji utawa luwih utas. Kita bisa kanthi gampang nyiyapake akses menyang sumber utawa obyek sing padha kanggo macem-macem utas, uga nyiyapake thread kanggo nglakokake blok kode siji.

Sembarang pangembang kudu nyinkronake karya karo utas sajrone operasi maca lan nulis kanggo sumber daya sing duwe macem-macem utas sing diparengake.

Penting yen nalika ngakses sumber daya sampeyan duwe data sing paling anyar supaya thread liyane bisa ngganti lan entuk informasi paling anyar. Malah yen kita njupuk conto saka akun bank, nganti dhuwit wis teka, sampeyan ora bisa nggunakake, supaya iku penting kanggo tansah duwe data up-to-date. Jawa nduweni kelas khusus kanggo nyinkronake lan ngatur utas.

Utas obyek

Iku kabeh diwiwiti kanthi utas utama (utama), yaiku, paling ora program sampeyan wis duwe siji utas sing mlaku. Utas utama bisa nggawe utas liyane nggunakake Callable utawa Runnable . Nggawe beda-beda mung ing asil bali, Runnable ora ngasilake asil lan ora bisa uncalan pangecualian dicenthang. Mulane, sampeyan entuk kesempatan sing apik kanggo mbangun karya sing efisien nganggo file, nanging iki mbebayani banget lan sampeyan kudu ati-ati.

Sampeyan uga bisa gawe jadwal eksekusi thread ing inti CPU kapisah. Sistem bisa gampang mindhah antarane Utas lan nglakokaké thread tartamtu kanthi setelan sing bener: yaiku, utas sing maca data dieksekusi dhisik, sanalika kita duwe data, banjur kita ngirim menyang thread sing tanggung jawab kanggo validasi. sawise iku kita pass menyang thread kanggo nglakokaké sawetara banjur logika bisnis lan thread anyar nulis maneh. Ing kahanan kaya mengkono, 4 utas ngolah data lan kabeh bakal luwih cepet tinimbang siji utas. Saben aliran kasebut diowahi dadi aliran OS asli, nanging carane bakal diowahi gumantung saka implementasine JVM.

Kelas Utas digunakake kanggo nggawe lan nggarap benang. Nduwe mekanisme kontrol standar, uga sing abstrak, kayata kelas lan koleksi saka java.util.concurrent .

Sinkronisasi Utas ing Jawa

Komunikasi diwenehake kanthi nuduhake akses menyang obyek. Iki efektif banget, nanging ing wektu sing padha gampang banget kanggo nggawe kesalahan nalika nggarap. Kesalahan dumadi ing rong kasus: gangguan benang - nalika benang liyane ngganggu thread sampeyan, lan kesalahan konsistensi memori - konsistensi memori. Kanggo ngatasi lan nyegah kesalahan kasebut, kita duwe cara sinkronisasi sing beda.

Sinkronisasi thread ing Jawa ditangani dening monitor, iki minangka mekanisme tingkat dhuwur sing ngidini mung siji thread kanggo nglakokake blok kode sing dilindhungi dening monitor sing padha. Prilaku monitor dianggep minangka kunci; siji monitor - siji kunci.

Sinkronisasi duwe sawetara poin penting sing kudu digatekake. Titik pisanan yaiku mutual exclusion - mung siji thread sing bisa duwe monitor, mula sinkronisasi ing monitor nuduhake yen siji thread mlebu blok sinkronisasi sing dilindhungi monitor, ora ana benang liyane sing bisa mlebu blok sing dilindhungi monitor. Utas pisanan metu saka blok sing disinkronake. Tegese, pirang-pirang benang ora bisa ngakses blok sing disinkronake ing wektu sing padha.

Nanging sinkronisasi ora mung mutual exclusion. Sinkronisasi mesthekake yen data sing ditulis ing memori sadurunge utawa ing blok sing disinkronake katon ing benang liyane sing disinkronake ing monitor sing padha. Sawise metu saka blok kasebut, kita ngeculake monitor lan benang liyane bisa nyekel lan miwiti nglakokake blok kode iki.

Nalika thread anyar njupuk monitor, kita entuk akses lan kemampuan kanggo nglakokaké pemblokiran kode kasebut, lan ing wektu iku variabel bakal dimuat saka memori utama. Banjur kita bisa ndeleng kabeh entri digawe katon dening release sadurungé saka monitor.

Waca-tulis ing lapangan minangka operasi atom yen lapangan kasebut diumumake molah malih utawa dilindhungi dening kunci unik sing dipikolehi sadurunge maca-tulis. Nanging yen sampeyan isih nemoni kesalahan, sampeyan bakal entuk kesalahan babagan ngatur maneh (ngganti urutan, ngatur maneh). Iku manifests dhewe ing salah sinkronisasi program multi-Utas, ngendi siji thread bisa mirsani efek sing diprodhuksi dening Utas liyane.

Efek saka eksklusi bebarengan lan sinkronisasi benang, yaiku, operasi sing bener ditindakake mung kanthi ngetik blok utawa cara sing disinkronake sing kanthi implisit entuk kunci, utawa kanthi tegas entuk kunci. Kita bakal ngomong babagan ing ngisor iki. Kaloro cara kerja kasebut mengaruhi memori sampeyan lan penting ora lali babagan nggarap variabel sing molah malih .

Sawah ing Jawa

Yen variabel ditandhani molah malih , kasedhiya global. Iki tegese yen thread ngakses variabel molah malih , iku bakal entuk nilai sadurunge nggunakake nilai saka cache.

A nulis dianggo kaya release monitor, lan maca dianggo kaya panangkepan monitor. Akses digawa metu ing hubungan saka jinis "dileksanakake sadurunge". Yen sampeyan ngerti, kabeh sing bakal katon ing Utas A nalika ngakses variabel molah malih yaiku variabel kanggo Utas B. Tegese, sampeyan dijamin ora bakal kelangan owah-owahan saka Utas liyane.

Variabel volatile yaiku atom, yaiku, nalika maca variabel kasebut, efek sing padha digunakake nalika entuk kunci - data ing memori kasebut ora bener utawa ora bener, lan nilai variabel molah malih diwaca saka memori . Nalika nulis, efek ing memori digunakake, uga nalika ngeculake kunci - kolom molah malih ditulis ing memori.

Jawa bebarengan

Yen sampeyan pengin nggawe aplikasi super-efisien lan multi-threaded, sampeyan kudu nggunakake kelas saka perpustakaan JavaConcurrent , sing ana ing paket java.util.concurrent .

Perpustakaan kasebut akeh banget lan nduweni fungsi sing beda-beda, mula ayo goleki apa sing ana ing njero lan dibagi dadi sawetara modul:

Jawa bebarengan

Concurrent Collections minangka kumpulan koleksi kanggo nggarap lingkungan multi-threaded. Tinimbang pambungkus dhasar Collections.synchronizedList kanthi ngalangi akses menyang kabeh koleksi, kunci digunakake ing segmen data utawa algoritma tanpa ngenteni digunakake kanggo maca data kanthi paralel.

Antrian - antrian non-blocking lan mblokir kanggo makarya ing lingkungan multi-threaded. Antrian non-blocking fokus ing kacepetan lan operasi tanpa ngalangi benang. Pamblokiran antrian cocok kanggo karya nalika sampeyan kudu "alon mudhun" thread Produser utawa Konsumen . Contone, ing kahanan sing sawetara kondisi ora ketemu, antrian kosong utawa kebak, utawa ora ana free Konsumen 'a.

Sinkronisasi minangka sarana utilitas kanggo nyinkronake benang. Dheweke minangka senjata sing kuat ing komputasi "paralel".

Executors minangka kerangka kanggo nggawe pools thread sing luwih trep lan gampang, gampang nyiyapake jadwal tugas sing ora sinkron kanthi entuk asil.

Kunci minangka akeh mekanisme sinkronisasi benang sing fleksibel dibandhingake karo sinkronisasi dhasar, ngenteni , notifikasi , notifyAll .

Atom minangka kelas sing bisa ndhukung operasi atom ing primitif lan referensi.