Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lære Ydeevne og Udfordringer | Grundlæggende om Multithreading
Multitrådning i Java

bookYdeevne og Udfordringer

Ydelsesmåling

Du kan bruge metoderne nanoTime() eller System.currentTimeMillis() til at måle eksekveringstiden for multitrådet kode.

Note
Bemærk

I denne video sammenlignes ydelsen af multitrådet og enkelttrådet summering af array-elementer i Java. Et array initialiseres med tilfældige heltal, opgaven fordeles mellem flere tråde for at beregne summen parallelt, og derefter udføres den samme summering sekventielt for at måle og sammenligne eksekveringstider.

Data Races

Race conditions opstår i multitrådede programmer, når to eller flere tråde samtidig forsøger at arbejde på en delt ressource uden korrekt synkronisering. Dette kan føre til uforudsigelig og forkert programadfærd, fordi resultaterne afhænger af, hvordan trådene eksekveres i parallelt, og hvor hurtigt de får adgang til den delte ressource.

Dette problem blev diskuteret i det foregående afsnit, hvor det blev vist, hvordan problemet kan løses ved hjælp af nøgleordet synchronized.

Uforudsigelig Adfærd

Uforudsigelig adfærd kan opstå som følge af forkert synkronisering. For eksempel kan manglende synkronisering føre til, at tråde arbejder med forældede data.

I denne video demonstrerer koden problemet med uforudsigelig adfærd i multitrådede applikationer forårsaget af usynkroniseret adgang til delt tilstand.

Note
Bemærk

Dette problem kan løses ved at bruge volatile nøgleordet. En variabel, der er erklæret som volatile, kan ændres af flere tråde samtidigt. Dette garanterer, at værdien af variablen straks er synlig for alle andre tråde efter ændringen.

Men du behøver ikke erklære alle felter som volatile

Variabler erklæret som volatile synkroniseres med hovedhukommelsen ved hver læse- og skriveadgang. Dette betyder, at når én tråd opdaterer værdien af en volatile variabel, er ændringen straks synlig for alle andre tråde, hvilket forbedrer synligheden. Det betyder dog også, at læsninger kan være langsommere, så brug kun volatile, når det er nødvendigt.

Deadlock

Deadlock opstår, når to eller flere tråde bliver fastlåst, fordi de venter på, at hinanden frigiver ressourcer.

I videoen stødte vi på deadlock, da to tråde samtidig låste monitorerne for objekter i forskellige sekvenser, hvilket førte til en situation, hvor trådene blot ventede på, at hinanden skulle frigive de monitorer, de havde brug for.

For at løse dette problem skal vi sikre, at sådanne situationer ikke opstår. Dette kan opnås ved at sørge for, at alle tråde låser monitorerne på objekter i samme rækkefølge.

I dette tilfælde vil den første tråd, der låser et objekts monitor, forhindre andre tråde i at låse den samme monitor, hvilket tvinger dem til at vente, indtil den første tråd fuldfører sin opgave. Først når den første tråd er færdig, vil den frigive monitoren, så andre tråde kan fortsætte.

Undgå problemer med multitrådning

Datasynkronisering: Brug synchronized-nøgleordet for metoder og kodeblokke for at forhindre dataræs.

Undgå gensidig låsning: Sørg for, at alle tråde tilegner sig ressourcer i samme rækkefølge.

1. Hvilken metode bruges til at måle kodekørselstid i nanosekunder?

2. Hvad kaldes problemet, når flere tråde samtidig forsøger at ændre den samme ressource?

question mark

Hvilken metode bruges til at måle kodekørselstid i nanosekunder?

Select the correct answer

question mark

Hvad kaldes problemet, når flere tråde samtidig forsøger at ændre den samme ressource?

Select the correct answer

Var alt klart?

Hvordan kan vi forbedre det?

Tak for dine kommentarer!

Sektion 1. Kapitel 5

Spørg AI

expand

Spørg AI

ChatGPT

Spørg om hvad som helst eller prøv et af de foreslåede spørgsmål for at starte vores chat

Awesome!

Completion rate improved to 3.33

bookYdeevne og Udfordringer

Stryg for at vise menuen

Ydelsesmåling

Du kan bruge metoderne nanoTime() eller System.currentTimeMillis() til at måle eksekveringstiden for multitrådet kode.

Note
Bemærk

I denne video sammenlignes ydelsen af multitrådet og enkelttrådet summering af array-elementer i Java. Et array initialiseres med tilfældige heltal, opgaven fordeles mellem flere tråde for at beregne summen parallelt, og derefter udføres den samme summering sekventielt for at måle og sammenligne eksekveringstider.

Data Races

Race conditions opstår i multitrådede programmer, når to eller flere tråde samtidig forsøger at arbejde på en delt ressource uden korrekt synkronisering. Dette kan føre til uforudsigelig og forkert programadfærd, fordi resultaterne afhænger af, hvordan trådene eksekveres i parallelt, og hvor hurtigt de får adgang til den delte ressource.

Dette problem blev diskuteret i det foregående afsnit, hvor det blev vist, hvordan problemet kan løses ved hjælp af nøgleordet synchronized.

Uforudsigelig Adfærd

Uforudsigelig adfærd kan opstå som følge af forkert synkronisering. For eksempel kan manglende synkronisering føre til, at tråde arbejder med forældede data.

I denne video demonstrerer koden problemet med uforudsigelig adfærd i multitrådede applikationer forårsaget af usynkroniseret adgang til delt tilstand.

Note
Bemærk

Dette problem kan løses ved at bruge volatile nøgleordet. En variabel, der er erklæret som volatile, kan ændres af flere tråde samtidigt. Dette garanterer, at værdien af variablen straks er synlig for alle andre tråde efter ændringen.

Men du behøver ikke erklære alle felter som volatile

Variabler erklæret som volatile synkroniseres med hovedhukommelsen ved hver læse- og skriveadgang. Dette betyder, at når én tråd opdaterer værdien af en volatile variabel, er ændringen straks synlig for alle andre tråde, hvilket forbedrer synligheden. Det betyder dog også, at læsninger kan være langsommere, så brug kun volatile, når det er nødvendigt.

Deadlock

Deadlock opstår, når to eller flere tråde bliver fastlåst, fordi de venter på, at hinanden frigiver ressourcer.

I videoen stødte vi på deadlock, da to tråde samtidig låste monitorerne for objekter i forskellige sekvenser, hvilket førte til en situation, hvor trådene blot ventede på, at hinanden skulle frigive de monitorer, de havde brug for.

For at løse dette problem skal vi sikre, at sådanne situationer ikke opstår. Dette kan opnås ved at sørge for, at alle tråde låser monitorerne på objekter i samme rækkefølge.

I dette tilfælde vil den første tråd, der låser et objekts monitor, forhindre andre tråde i at låse den samme monitor, hvilket tvinger dem til at vente, indtil den første tråd fuldfører sin opgave. Først når den første tråd er færdig, vil den frigive monitoren, så andre tråde kan fortsætte.

Undgå problemer med multitrådning

Datasynkronisering: Brug synchronized-nøgleordet for metoder og kodeblokke for at forhindre dataræs.

Undgå gensidig låsning: Sørg for, at alle tråde tilegner sig ressourcer i samme rækkefølge.

1. Hvilken metode bruges til at måle kodekørselstid i nanosekunder?

2. Hvad kaldes problemet, når flere tråde samtidig forsøger at ændre den samme ressource?

question mark

Hvilken metode bruges til at måle kodekørselstid i nanosekunder?

Select the correct answer

question mark

Hvad kaldes problemet, når flere tråde samtidig forsøger at ændre den samme ressource?

Select the correct answer

Var alt klart?

Hvordan kan vi forbedre det?

Tak for dine kommentarer!

Sektion 1. Kapitel 5
some-alt