Ce este Concurrency în Java? - Ghid complet de concurgență în Java

Cuprins:

Anonim

Ce este Concurrency în Java?

În lumea de azi, totul se dezvoltă rapid. Există întotdeauna un domeniu de îmbunătățiri în fiecare și în toate. La fel este și cazul limbajului nostru de programare. Astăzi, cu tehnologiile noastre moderne, ne așteptăm ca lucrurile să se facă cu ușurință și rapiditate. Pentru a face mai multe lucruri în același timp sau pentru a face mai multe lucruri simultan, a apărut conceptul de concurgență. Deci, ce este de fapt concordanța, care este utilizarea ei, de ce este acest lucru cu adevărat necesar și multe altele. Vom încerca să atingem astfel de întrebări și să le răspundem în acest articol una câte una. Așadar, să aducem discuția noastră într-o secțiune comună de bază, care este definiția concurentei. În acest subiect, vom afla despre Ce este concurgența în Java.

Definiția concurrency?

Deci, care este concurența de fapt? Ei bine, pentru a răspunde, permiteți-ne să luăm un scenariu comun. Să presupunem că în timp ce citiți acest articol, încercați să faceți mai multe lucruri simultan, poate că încercați să faceți și o notă, poate că încercați să o înțelegeți sau să gândiți unele lucruri. Deci, în cuvinte simple, încercați să faceți mai multe lucruri în paralel. Acest lucru înseamnă o concurgență. Concurrency pur și simplu execută mai multe sarcini în paralel între ele. Vom discuta despre concurența acestui articol în domeniul de aplicare al Java ca limbaj de programare.

De fapt, în Java sau, în general, în orice limbaj de programare, este firul care este responsabil de purtarea concurentei. Rolul de bază al acestor fire este acela de a facilita executarea paralelă a sarcinilor. Între timp, să avem o definiție de bază a thread-ului.

Deci, ce este o fire?

Un thread este un proces ușor cu propriul stack de apeluri. Cu toate acestea, un thread are privilegiul de a accesa date partajate din alte fire care se execută în cadrul aceluiași proces. În cadrul unei aplicații Java, putem utiliza multe fire pentru a realiza procesarea paralelă sau concordanța.

Acum să trecem la următorul nostru subiect, care este,

Concurență în definiția Java?

Deci, în Java sau orice alt limbaj de programare cum ar fi C #, etc., tot limbajul OOP are un concept de thread. În Java, avem diferite procese care se execută realizând diferite fire pentru a obține concurgență

Prin urmare, după această definiție simplă, să discutăm noul nostru subiect care este:

Ce face ca aplicația java să fie concomitentă?

Prima clasă, care trebuie să facă simultan o aplicație java, este clasa java.lang.Thread. Clasa java.lang.Thread este responsabilă pentru toate conceptele de concordanță din limbajul de programare Java. După aceasta avem o interfață java.lang.Runnable pentru a extrage comportamentul thread-ului din clasa thread.

O altă clasă de care va trebui să construim o aplicație avansată va fi utilizată din pachetul java.util.concurrent adăugat în Java 1.5.

Acum, am ajuns la o nouă întrebare care este:

Java Concurrency este într-adevăr atât de simplu?

Întrucât se pare că implementarea concurentei în Java este destul de simplă. Cu toate acestea, chiar nu este așa. Să ne vedem.

Discuția noastră de mai sus oferă, în general, impresia că concurenta este într-adevăr un concept simplu, bun și destul de ușor de implementat. Ei bine, dacă monitorizăm într-un mod mai bun și încercăm să-l înțelegem, descoperim că necesită o cantitate bună de înțelegere a conceptelor de bază, precum și o înțelegere completă a ceea ce trebuie să obținem.

Dacă comparăm aplicațiile concurente și o singură aplicație cu filet, în general descoperim că o aplicație concurentă este complexă din punct de vedere al proiectării și înțelegerii. Codul executat de mai multe fire necesită atenție specială și resurse pentru accesarea datelor partajate. Erorile care apar din cauza sincronizării incorecte a firului sunt greu de depanat și de remediat. De asemenea, în majoritatea scenariilor aceste erori nu sunt identificate în faza inițială, de fapt, sunt detectate în modul prod, care este chiar mai greu de reprodus.

În afară de erorile și defectele obișnuite, thread-urile simultane necesită mai multe resurse pentru a rula aplicația

Probleme și îmbunătățirea concurentei - Explicare cu exemplu

Deci, practic, există două tipuri de probleme care se atribuie datorită concurentei. Aceste probleme pot fi clasificate în două categorii

  • Erori de interferență a firelor
  • Erori de consistență a memoriei

Să ne înțelegem fiecare pe rând

Erori de interferență a firelor - Să ne înțelegem cu un exemplu simplu.

Să presupunem că avem o funcție de contor, al cărei rol de bază este de a crește contorul sau numărul unui număr. Acum, să presupunem că avem două fire, thread A și thread B. Să presupunem că thread A citește valoarea inițială ca 0. Acum, următorii pași se execută secvențial.

  1. Firul A citește valoarea inițială ca 0
  2. Firul B citește valoarea inițială ca 0
  3. Firul O creștere a valorii cu 1. Noua valoare este acum 1
  4. Firul B crește, de asemenea, în paralel, valoarea la 1.
  5. Firul A scrie o valoare actualizată care este 1 în celula de memorie
  6. Firul B repetă, de asemenea, aceeași etapă, care este scrisă în valoarea actualizată de 1 celulă de memorie

Aici apare problema. Două fire A & B, executați codul de două ori și valoarea preconizată este 2, dar ceea ce este reflectat este 1. Aceasta este principala problemă pe care o pot provoca mai multe fire

Cum ar putea fi rezolvat acest lucru?

Erorile de interferență a firelor pot fi rezolvate prin sincronizarea accesului la variabilele partajate. Trebuie să păstrăm sincronizarea valorilor actualizate între datele partajate

Prin aceasta, să ne uităm la al doilea tip de eroare

Erori de coerență a memoriei

Erorile de inconsecvență a memoriei apar în general atunci când diferite fire încearcă să citească sau au viziuni inconsistente pe aceeași informație. Acest lucru se întâmplă de obicei atunci când primul thread actualizează unele date partajate, iar această valoare actualizată nu este propagată la a doua sau la diferite fire și citesc date vechi.

Să vedem de ce se întâmplă asta?

Ei bine, ar putea exista multe cauze. De obicei, compilatorul realizează în general o mulțime de optimizări ale aplicației pentru a îmbunătăți performanța. De asemenea, poate actualiza secvențele de instrucțiuni pentru a optimiza performanța. Chiar și în general, procesoarele încearcă, de asemenea, să optimizeze codurile, de exemplu, un procesor ar putea citi valoarea curentă a unei variabile dintr-o memorie cache sau un registru temporar în loc de memoria principală

Concluzie - Ce este Concurrency în Java?

Concurența este o caracteristică foarte importantă a limbajului oricărui OOP. Filetarea ne oferă funcția de a executa mai multe procese în paralel între ele. Ne ajută să ne executăm mai rapid sarcina complexă. Cu toate acestea, cu argumente pro, concurrency are și câteva contra. Utilizarea filetării provoacă o utilizare grea a resurselor

Articole recomandate

Acesta a fost un Ghid pentru Ce este Concurrency în Java. Aici am discutat despre probleme și îmbunătățirea concurentei. Puteți parcurge și alte articole sugerate pentru a afla mai multe -

  1. Ce este multithreading în java?
  2. Cum să conectați baza de date în Java?
  3. Ce este multithreading în java?
  4. Ce este J2EE?