Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Oppiskele Suorituskyky ja Haasteet | Monisäikeisyyden Perusteet
Monisäikeisyys Javassa

bookSuorituskyky ja Haasteet

Suorituskyvyn mittaaminen

Voit käyttää nanoTime()- tai System.currentTimeMillis() -menetelmiä mitataksesi monisäikeisen koodin suoritusaikaa.

Note
Huomio

Tässä videossa koodi vertaa monisäikeisen ja yksisäikeisen taulukkoalkioiden yhteenlaskun suorituskykyä Javassa. Se alustaa taulukon satunnaisilla kokonaisluvuilla, jakaa tehtävän useille säikeille laskeakseen summan rinnakkain, ja suorittaa sitten saman yhteenlaskun peräkkäisesti mitatakseen ja vertaillakseen suoritusaikoja.

Kilpailevat tilat

Kilpailevat tilat esiintyvät monisäikeisissä ohjelmissa, kun kaksi tai useampi säie yrittää samanaikaisesti käyttää ja muokata jaettua resurssia ilman asianmukaista synkronointia. Tämä voi johtaa arvaamattomaan ja virheelliseen ohjelmakäyttäytymiseen, koska tulokset riippuvat siitä, miten säikeet suorittavat tehtävänsä rinnakkain ja kuinka nopeasti ne pääsevät käsiksi jaettuun resurssiin.

Tätä ongelmaa käsiteltiin edellisessä osiossa, jossa näytettiin, miten ongelma ratkaistaan käyttämällä synchronized-avainsanaa.

Ennustamaton käyttäytyminen

Ennustamaton käyttäytyminen voi johtua virheellisestä synkronoinnista. Esimerkiksi synkronoinnin puute voi johtaa siihen, että säikeet työskentelevät vanhentuneen datan kanssa.

Tällä videolla koodi havainnollistaa ennustamattoman käyttäytymisen ongelmaa monisäikeisissä sovelluksissa, joka johtuu synkronoimattoman jaetun tilan käytöstä.

Note
Huomio

Tämä ongelma voidaan ratkaista käyttämällä volatile-avainsanaa. Muuttuja, joka on määritelty volatile:ksi, voidaan muokata usean säikeen toimesta samanaikaisesti. Tämä takaa, että muuttujan arvo on välittömästi näkyvissä kaikille muille säikeille muutoksen jälkeen.

Kaikkia kenttiä ei tarvitse määritellä volatileksi

Muuttujat, jotka on määritelty volatile-avainsanalla, synkronoidaan päämuistin kanssa jokaisella luku- ja kirjoitustoiminnolla. Tämä tarkoittaa, että kun yksi säie päivittää volatile-muuttujan arvoa, muutos näkyy välittömästi kaikille muille säikeille, mikä parantaa näkyvyyttä. Tämä voi kuitenkin hidastaa lukutoimintoja, joten käytä volatile-määrettä vain tarvittaessa.

Deadlock

Deadlock eli umpikujatilanne syntyy, kun kaksi tai useampi säiettä jää odottamaan toisiaan vapauttamaan resursseja.

Videolla kohtasimme deadlockin, kun kaksi säiettä lukitsi samanaikaisesti olioiden monitorit eri järjestyksessä, mikä johti tilanteeseen, jossa säikeet jäivät yksinkertaisesti odottamaan toisiaan vapauttamaan tarvitsemiaan monitoreja.

Tämän ongelman ratkaisemiseksi on varmistettava, että tällaisia tilanteita ei pääse syntymään. Tämä voidaan saavuttaa varmistamalla, että kaikki säikeet lukitsevat olioiden monitorit samassa järjestyksessä.

Tässä tapauksessa ensimmäinen säie, joka lukitsee olion monitorin, estää muita säikeitä lukitsemasta samaa monitoria, pakottaen ne odottamaan, kunnes ensimmäinen säie saa tehtävänsä valmiiksi. Vasta kun ensimmäinen säie on valmis, se vapauttaa monitorin, jolloin muut säikeet voivat jatkaa.

Monisäikeisyyden ongelmien välttäminen

Datan synkronointi: Käytä synchronized-avainsanaa metodeissa ja koodilohkoissa estääksesi dataristiriidat.

Vältä molemminpuolista lukitusta: Varmista, että kaikki säikeet hankkivat resurssit samassa järjestyksessä.

1. Mikä menetelmä mittaa koodin suoritusaikaa nanosekunneissa?

2. Mikä on ongelman nimi, kun useat säikeet yrittävät samanaikaisesti muokata samaa resurssia?

question mark

Mikä menetelmä mittaa koodin suoritusaikaa nanosekunneissa?

Select the correct answer

question mark

Mikä on ongelman nimi, kun useat säikeet yrittävät samanaikaisesti muokata samaa resurssia?

Select the correct answer

Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 1. Luku 5

Kysy tekoälyä

expand

Kysy tekoälyä

ChatGPT

Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme

Awesome!

Completion rate improved to 3.33

bookSuorituskyky ja Haasteet

Pyyhkäise näyttääksesi valikon

Suorituskyvyn mittaaminen

Voit käyttää nanoTime()- tai System.currentTimeMillis() -menetelmiä mitataksesi monisäikeisen koodin suoritusaikaa.

Note
Huomio

Tässä videossa koodi vertaa monisäikeisen ja yksisäikeisen taulukkoalkioiden yhteenlaskun suorituskykyä Javassa. Se alustaa taulukon satunnaisilla kokonaisluvuilla, jakaa tehtävän useille säikeille laskeakseen summan rinnakkain, ja suorittaa sitten saman yhteenlaskun peräkkäisesti mitatakseen ja vertaillakseen suoritusaikoja.

Kilpailevat tilat

Kilpailevat tilat esiintyvät monisäikeisissä ohjelmissa, kun kaksi tai useampi säie yrittää samanaikaisesti käyttää ja muokata jaettua resurssia ilman asianmukaista synkronointia. Tämä voi johtaa arvaamattomaan ja virheelliseen ohjelmakäyttäytymiseen, koska tulokset riippuvat siitä, miten säikeet suorittavat tehtävänsä rinnakkain ja kuinka nopeasti ne pääsevät käsiksi jaettuun resurssiin.

Tätä ongelmaa käsiteltiin edellisessä osiossa, jossa näytettiin, miten ongelma ratkaistaan käyttämällä synchronized-avainsanaa.

Ennustamaton käyttäytyminen

Ennustamaton käyttäytyminen voi johtua virheellisestä synkronoinnista. Esimerkiksi synkronoinnin puute voi johtaa siihen, että säikeet työskentelevät vanhentuneen datan kanssa.

Tällä videolla koodi havainnollistaa ennustamattoman käyttäytymisen ongelmaa monisäikeisissä sovelluksissa, joka johtuu synkronoimattoman jaetun tilan käytöstä.

Note
Huomio

Tämä ongelma voidaan ratkaista käyttämällä volatile-avainsanaa. Muuttuja, joka on määritelty volatile:ksi, voidaan muokata usean säikeen toimesta samanaikaisesti. Tämä takaa, että muuttujan arvo on välittömästi näkyvissä kaikille muille säikeille muutoksen jälkeen.

Kaikkia kenttiä ei tarvitse määritellä volatileksi

Muuttujat, jotka on määritelty volatile-avainsanalla, synkronoidaan päämuistin kanssa jokaisella luku- ja kirjoitustoiminnolla. Tämä tarkoittaa, että kun yksi säie päivittää volatile-muuttujan arvoa, muutos näkyy välittömästi kaikille muille säikeille, mikä parantaa näkyvyyttä. Tämä voi kuitenkin hidastaa lukutoimintoja, joten käytä volatile-määrettä vain tarvittaessa.

Deadlock

Deadlock eli umpikujatilanne syntyy, kun kaksi tai useampi säiettä jää odottamaan toisiaan vapauttamaan resursseja.

Videolla kohtasimme deadlockin, kun kaksi säiettä lukitsi samanaikaisesti olioiden monitorit eri järjestyksessä, mikä johti tilanteeseen, jossa säikeet jäivät yksinkertaisesti odottamaan toisiaan vapauttamaan tarvitsemiaan monitoreja.

Tämän ongelman ratkaisemiseksi on varmistettava, että tällaisia tilanteita ei pääse syntymään. Tämä voidaan saavuttaa varmistamalla, että kaikki säikeet lukitsevat olioiden monitorit samassa järjestyksessä.

Tässä tapauksessa ensimmäinen säie, joka lukitsee olion monitorin, estää muita säikeitä lukitsemasta samaa monitoria, pakottaen ne odottamaan, kunnes ensimmäinen säie saa tehtävänsä valmiiksi. Vasta kun ensimmäinen säie on valmis, se vapauttaa monitorin, jolloin muut säikeet voivat jatkaa.

Monisäikeisyyden ongelmien välttäminen

Datan synkronointi: Käytä synchronized-avainsanaa metodeissa ja koodilohkoissa estääksesi dataristiriidat.

Vältä molemminpuolista lukitusta: Varmista, että kaikki säikeet hankkivat resurssit samassa järjestyksessä.

1. Mikä menetelmä mittaa koodin suoritusaikaa nanosekunneissa?

2. Mikä on ongelman nimi, kun useat säikeet yrittävät samanaikaisesti muokata samaa resurssia?

question mark

Mikä menetelmä mittaa koodin suoritusaikaa nanosekunneissa?

Select the correct answer

question mark

Mikä on ongelman nimi, kun useat säikeet yrittävät samanaikaisesti muokata samaa resurssia?

Select the correct answer

Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 1. Luku 5
some-alt