"Bună, Amigo! Ieri am discutat despre beneficiile și avantajele multithreadingului. Acum este timpul să ne uităm la dezavantaje. Și, din păcate, nu sunt mici."
Anterior, am privit un program ca pe un set de obiecte care își numesc metodele unul altuia. Acum totul devine puțin mai complicat. Un program seamănă mai mult cu un set de obiecte care are mai mulți „roboți mici” (fire) care se târăsc prin el și execută comenzile conținute în metode.
Această nouă interpretare nu o anulează pe prima. Sunt încă obiecte și încă își numesc metode unul altuia. Dar trebuie să ne amintim că există mai multe fire și fiecare thread își face treaba sau sarcina.
Un program devine din ce în ce mai complicat. Diferite fire de execuție schimbă starea diferitelor obiecte în funcție de sarcinile pe care le îndeplinesc. Și se pot călca unul pe altul.
Dar cele mai rele lucruri se întâmplă adânc în interiorul mașinii Java. După cum am spus deja, aparenta simultaneitate a firelor de execuție se realizează prin faptul că procesorul trece constant de la un thread la altul. Trece la un fir, funcționează timp de 10 milisecunde, trece la următorul fir, funcționează timp de 10 milisecunde și așa mai departe. Și aici constă problema: aceste comutări pot apărea în cele mai inoportune momente. Luați în considerare acest exemplu:
Codul primului fir | Codul celui de-al doilea fir |
---|---|
|
|
Ce ne așteptam să fie afișat |
---|
Nick are 15 ani Lena are 21 de ani |
Execuția reală a codului | Codul primului fir | Codul celui de-al doilea fir |
---|---|---|
|
|
|
Ce este de fapt afișat |
---|
Nick este Lena are 15 21 de ani |
Și iată un alt exemplu:
Cod | Descriere |
---|---|
|
Metoda de schimb swap valorile variabilelor name1 și name2 .
Ce s-ar putea întâmpla dacă este apelat din două fire în același timp? |
Execuția reală a codului | Codul primului fir | Codul celui de-al doilea fir |
---|---|---|
|
|
|
Linia de jos |
---|
Ambele variabile au valoarea «Lena». Obiectul «Ally» nu a reușit. S-a pierdut. |
„Cine ar fi ghicit că astfel de erori sunt posibile cu o operație de atribuire atât de simplă?!”
"Da, această problemă are o soluție. Dar despre asta vom vorbi puțin mai târziu - gâtul meu este uscat."
GO TO FULL VERSION