CodeGym/Java kursus/Modul 3/Java Concurrency Library

Java Concurrency Library

Ledig

Multithreading i Java

Java Virtual Machine understøtter parallel computing . Alle beregninger kan udføres i sammenhæng med en eller flere tråde. Vi kan nemt konfigurere adgang til den samme ressource eller objekt for flere tråde, samt konfigurere en tråd til at udføre en enkelt kodeblok.

Enhver udvikler skal synkronisere arbejde med tråde under læse- og skriveoperationer for ressourcer, der har flere tråde allokeret til dem.

Det er vigtigt, at du på tidspunktet for adgang til ressourcen har opdaterede data, så en anden tråd kan ændre det, og du får den mest opdaterede information. Selvom vi tager eksemplet med en bankkonto, indtil pengene er kommet til den, kan du ikke bruge dem, så det er vigtigt altid at have opdaterede data. Java har specielle klasser til synkronisering og styring af tråde.

Tråd genstande

Det hele starter med hovedtråden (hovedtråden), det vil sige, at dit program i det mindste allerede har en kørende tråd. Hovedtråden kan oprette andre tråde ved at bruge Callable eller Runnable . Oprettelsen adskiller sig kun i returneringsresultatet, Runnable returnerer ikke et resultat og kan ikke kaste en markeret undtagelse. Derfor får du en god mulighed for at bygge effektivt arbejde med filer, men det er meget farligt, og du skal være forsigtig.

Det er også muligt at planlægge trådudførelse på en separat CPU-kerne. Systemet kan nemt flytte mellem tråde og udføre en specifik tråd med de rigtige indstillinger: det vil sige, at den tråd der læser dataene bliver udført først, så snart vi har data, så sender vi dem videre til tråden der er ansvarlig for validering, derefter sender vi det til tråden for at udføre nogle forretningslogik og en ny tråd skriver dem tilbage. I en sådan situation behandler 4 tråde data på skift, og alt vil fungere hurtigere end én tråd. Hver sådan strøm konverteres til en native OS-strøm, men hvordan den konverteres afhænger af JVM-implementeringen.

Trådklassen bruges til at skabe og arbejde med tråde . Det har standard kontrolmekanismer, såvel som abstrakte, såsom klasser og samlinger fra java.util.concurrent .

Trådsynkronisering i Java

Kommunikation sker ved at dele adgang til objekter. Dette er meget effektivt, men det er samtidig meget nemt at lave en fejl, når du arbejder. Fejl kommer i to tilfælde: trådinterferens - når en anden tråd forstyrrer din tråd, og hukommelseskonsistensfejl - hukommelseskonsistens. For at løse og forhindre disse fejl har vi forskellige synkroniseringsmetoder.

Trådsynkronisering i Java håndteres af skærme, dette er en mekanisme på højt niveau, der tillader kun én tråd at udføre en kodeblok beskyttet af den samme skærm ad gangen. Skærmenes opførsel betragtes i form af låse; en skærm - en lås.

Synkronisering har flere vigtige punkter, som du skal være opmærksom på. Det første punkt er gensidig udelukkelse - kun én tråd kan eje monitoren, så synkronisering på monitoren indebærer, at når én tråd kommer ind i en synkroniseret blok beskyttet af monitoren, kan ingen anden tråd komme ind i blokken beskyttet af monitoren. første tråd forlader den synkroniserede blok. Det vil sige, at flere tråde ikke kan få adgang til den samme synkroniserede blok på samme tid.

Men synkronisering er ikke kun gensidig udelukkelse. Synkronisering sikrer, at data skrevet til hukommelsen før eller inden for en synkroniseret blok bliver synlige for andre tråde, der er synkroniseret på den samme skærm. Efter at have forladt blokken, frigiver vi monitoren, og en anden tråd kan gribe den og begynde at udføre denne kodeblok.

Når en ny tråd fanger skærmen, får vi adgang til og muligheden for at udføre den kodeblok, og på det tidspunkt vil variablerne blive indlæst fra hovedhukommelsen. Så kan vi se alle de poster, der er gjort synlige af den tidligere udgivelse af skærmen.

En læse-skrive på et felt er en atomoperation, hvis feltet enten er erklæret flygtigt eller beskyttet af en unik lås erhvervet før nogen læse-skrive. Men hvis du stadig støder på en fejl, så får du en fejl om genbestilling (ændring af rækkefølge, genbestilling). Det viser sig i forkert synkroniserede multi-threaded programmer, hvor en tråd kan observere de effekter, der produceres af andre tråde.

Effekten af ​​gensidig udelukkelse og synkronisering af tråde, det vil sige deres korrekte drift opnås kun ved at indtaste en synkroniseret blok eller metode, der implicit erhverver en lås, eller ved eksplicit at opnå en lås. Vi vil tale om det nedenfor. Begge måder at arbejde på påvirker din hukommelse, og det er vigtigt ikke at glemme at arbejde med flygtige variable.

Flygtige felter i Java

Hvis en variabel er markeret som volatil , er den tilgængelig globalt. Dette betyder, at hvis en tråd får adgang til en flygtig variabel, vil den få sin værdi, før den bruger værdien fra cachen.

En skrivning fungerer som en skærmudgivelse, og en læsning fungerer som en skærmoptagelse. Adgang udføres i en relation af typen "udført før". Hvis du finder ud af det, er alt, hvad der vil være synligt for tråd A, når den får adgang til en flygtig variabel, variablen for tråd B. Det vil sige, at du med garanti ikke mister dine ændringer fra andre tråde.

Flygtige variable er atomare, det vil sige, når man læser en sådan variabel, bruges den samme effekt, som når man opnår en lås - dataene i hukommelsen erklæres ugyldige eller forkerte, og værdien af ​​den flygtige variabel læses igen fra hukommelsen. Ved skrivning bruges effekten på hukommelsen, samt ved udløsning af en lås - et flygtigt felt skrives til hukommelsen.

Java samtidig

Hvis du vil lave en supereffektiv og multi-threaded applikation, skal du bruge klasserne fra JavaConcurrent- biblioteket , som er i pakken java.util.concurrent .

Biblioteket er meget omfangsrigt og har forskellig funktionalitet, så lad os tage et kig på, hvad der er indeni, og dele det op i nogle moduler:

Java samtidig

Concurrent Collections er et sæt samlinger til arbejde i et multi-threaded miljø. I stedet for den grundlæggende wrapper Collections.synchronizedList med blokering af adgang til hele samlingen, bruges låse på datasegmenter eller ventefri algoritmer bruges til at læse data parallelt.

Køer - ikke-blokerende og blokerende køer til arbejde i et multi-threaded miljø. Ikke-blokerende køer fokuserer på hastighed og drift uden at blokere tråde. Blokeringskøer er velegnede til arbejde, når du skal "sænke farten" i Producer- eller Consumer -trådene . For eksempel, i en situation, hvor nogle af betingelserne ikke er opfyldt, er køen tom eller fuld, eller der er ingen ledig Forbruger 'a.

Synkroniseringsprogrammer er hjælpeprogrammer til synkronisering af tråde. De er et stærkt våben i "parallel" databehandling.

Executors er en ramme for mere bekvem og nem oprettelse af trådpuljer, det er nemt at opsætte planlægning af asynkrone opgaver med opnåelse af resultater.

Låse er mange fleksible trådsynkroniseringsmekanismer sammenlignet med de grundlæggende synkroniserede , vent , notify , notifyAll .

Atomer er klasser, der kan understøtte atomariske operationer på primitiver og referencer.

Kommentarer
  • Populær
  • Ny
  • Gammel
Du skal være logget ind for at skrive en kommentar
Denne side har ingen kommentarer endnu