CodeGym/Java kurs/Modul 3/Java Concurrency Library

Java Concurrency Library

Tilgjengelig

Multithreading i Java

Java Virtual Machine støtter parallell databehandling . Alle beregninger kan utføres i sammenheng med en eller flere tråder. Vi kan enkelt sette opp tilgang til samme ressurs eller objekt for flere tråder, samt sette opp en tråd for å utføre en enkelt kodeblokk.

Enhver utvikler må synkronisere arbeid med tråder under lese- og skriveoperasjoner for ressurser som har flere tråder allokert til dem.

Det er viktig at du ved tilgang til ressursen har oppdaterte data slik at en annen tråd kan endre den og du får den mest oppdaterte informasjonen. Selv om vi tar eksempelet med en bankkonto, inntil pengene har kommet til den, kan du ikke bruke den, så det er viktig å alltid ha oppdaterte data. Java har spesielle klasser for synkronisering og administrasjon av tråder.

Tråd gjenstander

Det hele starter med hovedtråden (hovedtråden), det vil si at programmet ditt i det minste allerede har en løpende tråd. Hovedtråden kan opprette andre tråder ved å bruke Callable eller Runnable . Opprettelsen avviker bare i returresultatet, Runnable returnerer ikke et resultat og kan ikke kaste et sjekket unntak. Derfor får du en god mulighet til å bygge effektivt arbeid med filer, men dette er veldig farlig og du må være forsiktig.

Det er også mulig å planlegge trådkjøring på en separat CPU-kjerne. Systemet kan enkelt flytte mellom tråder og kjøre en spesifikk tråd med de riktige innstillingene: det vil si at tråden som leser dataene kjøres først, så snart vi har data, så sender vi den videre til tråden som er ansvarlig for validering, etter det sender vi det til tråden for å utføre noen forretningslogikk og en ny tråd skriver dem tilbake. I en slik situasjon behandler 4 tråder data etter tur, og alt vil fungere raskere enn én tråd. Hver slik strøm konverteres til en innebygd OS-strøm, men hvordan den vil bli konvertert avhenger av JVM-implementeringen.

Trådklassen brukes til å lage og jobbe med tråder . Den har standard kontrollmekanismer, så vel som abstrakte, som klasser og samlinger fra java.util.concurrent .

Trådsynkronisering i Java

Kommunikasjon gis ved å dele tilgang til objekter. Dette er veldig effektivt, men samtidig er det veldig lett å gjøre feil når du jobber. Feil kommer i to tilfeller: trådinterferens - når en annen tråd forstyrrer tråden din, og minnekonsistensfeil - minnekonsistens. For å løse og forhindre disse feilene har vi forskjellige synkroniseringsmetoder.

Trådsynkronisering i Java håndteres av monitorer, dette er en mekanisme på høyt nivå som lar bare én tråd utføre en kodeblokk beskyttet av samme monitor om gangen. Oppførselen til monitorer vurderes når det gjelder låser; en skjerm - en lås.

Synkronisering har flere viktige punkter som du må være oppmerksom på. Det første punktet er gjensidig ekskludering - bare én tråd kan eie monitoren, og dermed innebærer synkronisering på monitoren at når én tråd går inn i en synkronisert blokk beskyttet av monitoren, kan ingen annen tråd gå inn i blokken som er beskyttet av monitoren. første tråd går ut av den synkroniserte blokken. Det vil si at flere tråder ikke kan få tilgang til den samme synkroniserte blokken samtidig.

Men synkronisering er ikke bare gjensidig utestenging. Synkronisering sikrer at data skrevet til minnet før eller innenfor en synkronisert blokk blir synlig for andre tråder som er synkronisert på samme monitor. Etter å ha forlatt blokken, slipper vi skjermen og en annen tråd kan ta den og begynne å utføre denne kodeblokken.

Når en ny tråd fanger opp skjermen, får vi tilgang til og muligheten til å utføre den kodeblokken, og på det tidspunktet vil variablene lastes fra hovedminnet. Da kan vi se alle oppføringene som ble gjort synlige av den forrige utgivelsen av skjermen.

En lese-skriving på et felt er en atomoperasjon hvis feltet enten er erklært flyktig eller beskyttet av en unik lås anskaffet før noen lese-skriving. Men hvis du fortsatt støter på en feil, får du en feilmelding om ombestilling (endre rekkefølge, ombestilling). Det manifesterer seg i feilsynkroniserte flertrådsprogrammer, der en tråd kan observere effektene som produseres av andre tråder.

Effekten av gjensidig ekskludering og synkronisering av tråder, det vil si at deres korrekte drift oppnås bare ved å gå inn i en synkronisert blokk eller metode som implisitt anskaffer en lås, eller ved eksplisitt å skaffe en lås. Vi snakker om det nedenfor. Begge måtene å jobbe på påvirker hukommelsen og det er viktig å ikke glemme å jobbe med flyktige variabler.

Volatile felt i Java

Hvis en variabel er merket som volatil , er den tilgjengelig globalt. Dette betyr at hvis en tråd får tilgang til en flyktig variabel, vil den få verdien før den bruker verdien fra cachen.

En skriving fungerer som en skjermutgivelse, og en lesing fungerer som en skjermopptak. Tilgang utføres i en relasjon av typen «utført før». Hvis du finner ut av det, er alt som vil være synlig for tråd A når den får tilgang til en flyktig variabel variabelen for tråd B. Det vil si at du garantert ikke mister endringene fra andre tråder.

Flyktige variabler er atomære, det vil si at når du leser en slik variabel, brukes den samme effekten som når du får en lås - dataene i minnet erklæres ugyldige eller feilaktige, og verdien til den flyktige variabelen leses igjen fra minnet . Når du skriver, brukes effekten på minnet, samt når du slipper en lås - et flyktig felt skrives til minnet.

Java samtidig

Hvis du vil lage en supereffektiv og flertrådsapplikasjon, må du bruke klassene fra JavaConcurrent- biblioteket , som er i java.util.concurrent -pakken .

Biblioteket er veldig omfangsrikt og har forskjellig funksjonalitet, så la oss ta en titt på hva som er inne og dele det inn i noen moduler:

Java samtidig

Concurrent Collections er et sett med samlinger for arbeid i et flertrådsmiljø. I stedet for den grunnleggende wrapperen Collections.synchronizedList med blokkering av tilgang til hele samlingen, brukes låser på datasegmenter eller ventefrie algoritmer brukes til å lese data parallelt.

Køer - ikke-blokkerende og blokkerende køer for arbeid i et flertrådsmiljø. Ikke-blokkerende køer fokuserer på hastighet og drift uten å blokkere tråder. Blokkeringskøer er egnet for arbeid når du trenger å "bremse" produsent- eller forbrukertrådene . For eksempel, i en situasjon der noen av vilkårene ikke er oppfylt, er køen tom eller full, eller det er ingen ledig Forbruker 'a.

Synchronizers er verktøy for synkronisering av tråder. De er et kraftig våpen i "parallell" databehandling.

Executors er et rammeverk for mer praktisk og enkel opprettelse av trådpooler, det er enkelt å sette opp planlegging av asynkrone oppgaver med å oppnå resultater.

Låser er mange fleksible trådsynkroniseringsmekanismer sammenlignet med de grunnleggende synkroniserte , vent , varsle , varsleAlle .

Atomer er klasser som kan støtte atomoperasjoner på primitiver og referanser.

Kommentarer
  • Populær
  • Ny
  • Gammel
Du må være pålogget for å legge igjen en kommentar
Denne siden har ingen kommentarer ennå