Mis on Java kokkulangevus?
Tänapäeva maailmas areneb kõik kiiresti. Kõigis ja kõigis on alati arenguruumi. Nii on ka meie programmeerimiskeelega. Täna ootame oma kaasaegsete tehnoloogiate abil, et asju tehakse hõlpsalt ja kiiresti. Mitme asja korraga tegemise või mitme asja korraga tegemise ajal tekkis samaaegsuse mõiste. Mis tegelikult on samaaegsus, mis on selle kasutamine, miks seda tegelikult vaja on ja palju muud. Püüame selliseid küsimusi puudutada ja neile käesolevas artiklis neile ükshaaval vastata. Viige see arutelu väga põhilisse ühisesse ossa, mis on samaaegsuse määratlus. Selles teemas tutvume teemaga Mis on Java kokkulangevus.
Samaaeguse määratlus?
Mis samaaegne tegelikult on? Noh, sellele vastuseks võtkem ühine stsenaarium. Oletame, et seda artiklit lugedes proovite teha korraga mitu asja, võib-olla proovite ka märkust teha, ehk proovite sellest aru saada või mõtlete mõnda asja. Nii et proovite lihtsate sõnadega teha paralleelselt mitut asja. Seda tähendab samaaegsus. Samaaegsus tähendab lihtsalt mitme ülesande täitmist üksteisega paralleelselt. Selles artiklis käsitleme Java kui programmeerimiskeele ulatust.
Tegelikult, Java või üldiselt mis tahes programmeerimiskeeles, vastutab paralleelsuse hoidmise eest lõime. Nende lõimede põhiroll on ülesannete paralleelse täitmise hõlbustamine. Vahepeal olgem lõime põhimääratlus.
Mis on niit?
Niit on kerge protsess, millel on oma kõnepakk. Kuid niidil on privileeg pääseda juurde sama protsessi käigus täidetavate muude lõimede jagatud andmetele. Java-rakenduses saame paralleelse töötlemise või samaaegsuse saavutamiseks kasutada palju lõime.
Liigume nüüd järgmise teema juurde, milleks on:
Java määratluse samaaegsus?
Niisiis, Java või mõne muu programmeerimiskeele nagu C # jne korral on kõigil OOP keeltel keermestamise kontseptsioon. Java-s on meil erinevad protsessid, mille käivitamiseks tehakse samaaegsuse saavutamiseks erinevad lõimed
Nii et pärast seda lihtsat määratlust arutame oma uut teemat:
Mis teeb Java rakenduse samaaegseks?
Esimene klass, mida vajatakse Java-rakenduse samaaegseks tegemiseks, on java.lang.Lõputund. java.lang.Thread-klass vastutab kõigi Java programmeerimiskeele samaaegsuse mõistete eest. Pärast seda on meil java.lang.Käivitav liides lõime käitumise lõimimiseks lõimiklassist välja.
Muud klassi, mida me vajame täpsema rakenduse ehitamiseks, kasutatakse Java 1.5 lisatud paketist java.util.concurrent.
Nüüd oleme sellega jõudnud uue küsimuseni, milleks on:
Kas Java samaaegsus on tõesti nii lihtne?
Kuna tundub, et Java samaaegsuse rakendamine on üsna lihtne. Kuid see pole tegelikult nii. Vaatame seda.
Meie ülaltoodud arutelust jääb üldiselt mulje, et samaaegsus on tõepoolest lihtne, hea idee ja üsna hõlpsasti rakendatav. Noh, kui me jälgime paremat moodi ja proovime sellest aru saada, siis leiame, et see nõuab palju mõistmist põhimõistetest ja põhjalikku mõistmist selle kohta, mida me peame saavutama.
Kui võrrelda samaaegseid rakendusi ja ühte keermestatud rakendust, siis leiame üldiselt, et samaaegne rakendus on kavandamise ja mõistmise mõttes keeruline. Mitme lõime abil käivitatav kood nõuab jagatud andmetele juurdepääsuks erilist tähelepanu ja ressursse. Keerme ebaõige sünkroniseerimise tõttu hüppavaid vigu on raske siluda ja parandada. Samuti ei õnnestu enamikus stsenaariumides neid vigu algfaasis tuvastada, tegelikult tuvastatakse see tooterežiimis, mida on veelgi raskem reprodutseerida.
Lisaks vigadele ja tavalistele vigadele vajavad samaaegsed lõimed rakenduse käitamiseks rohkem ressursse
Probleemid ja samaaegsuse parandamine - selgitus näitega
Nii et põhimõtteliselt on kahte tüüpi probleeme, mis ilmnevad samaaegsuse tõttu. Need probleemid võib üldjoontes jagada kahte kategooriasse
- Keermehäired
- Mälu järjepidevuse vead
Mõistagem ükshaaval
Keerme häirimisvead - mõelgem lihtsa näitega.
Oletame, et meil on loendurifunktsioon, mille põhiroll on numbri loenduri või arvu suurendamine. Oletame nüüd, et meil on kaks lõime, keerme A ja lõime B. Oletame, et lõime A algväärtus on 0. Nüüd jooksevad järgmised toimingud järjest.
- Keerme A algväärtus on 0
- Keerme B algväärtus on 0
- Teema Väärtuse suurendamine ühe võrra. Uus väärtus on nüüd 1
- Keerme B suurendage ka paralleelselt väärtust 1-ni.
- Lõim A kirjutab mälu lahtrisse värskendatud väärtuse, mis on 1
- Niit B kordab ka sama sammu, mis kirjutatakse mäluelemendi värskendatud väärtuses 1
Nii et siin tekib probleem. Kaks lõime A ja B, käivitage kood kaks korda ja eeldatav väärtus on 2, kuid see, mis kajastub, on 1. See on peamine probleem, mida mitu lõime võivad põhjustada
Kuidas seda lahendada?
Keermehäirete tõrkeid saab lahendada sünkroonides juurdepääsu jagatud muutujatele. Peame jagatud andmete vahel värskendatud väärtusi sünkroonis hoidma
Sellega uurime teist tüüpi vigu
Mälu järjepidevuse vead
Mälu ebakõlade tõrked tekivad tavaliselt siis, kui erinevad lõimed üritavad sama andmekogu lugeda või kui neil on vastuolulised vaated. See juhtub tavaliselt siis, kui esimene lõim värskendab mõnda jagatud teavet ja seda värskendatud väärtust ei levitata teiseks ega erinevaks lõimeks ning nad loevad vanu andmeid.
Las vaata, miks see juhtub?
Noh, sellel võib olla palju põhjuseid. Tavaliselt teeb kompilaator rakenduse jõudluse parandamiseks palju optimeerimisi. Samuti võib jõudluse optimeerimiseks värskendada juhiste jadasid. Isegi üldiselt püüavad protsessorid koode ka optimeerida, näiteks võib keskseade põhimälu asemel lugeda muutuja praegust väärtust vahemälust või ajutisest registrist
Järeldus - mis on Java kokkulangevus?
Paralleelsus on mis tahes OOP keele väga oluline omadus. Keermestamine annab meile võimaluse teostada mitu protsessi üksteisega paralleelselt. See aitab meil oma keerulist ülesannet kiiremini täita. Kuid plusside osas on samaaegsusel ka vähe miinuseid. Keermestamise kasutamine põhjustab ressursside suurt kasutamist
Soovitatavad artiklid
See on olnud juhend selle kohta, mis on Java kokkulangevus. Siin oleme näitega arutanud probleeme ja parandamist samaaegsuses. Lisateavet leiate ka meie muudest soovitatud artiklitest -
- Mis on mitmekeelsus javas?
- Kuidas Java andmebaasi ühendada?
- Mis on mitmekeelsus javas?
- Mis on J2EE?