Bruke synkronisert - 1

"Hei, Amigo!"

"Ja, jeg er her, jeg er her."

"I dag vil jeg fortelle deg om bruk av synkronisert i praksis."

"Når et program har mange objekter og tråder, hender det ofte at flere tråder jobber med samme objekt samtidig. Ved å gjøre det forstyrrer trådene hverandre."

"Ja, jeg vet dette allerede."

"Så, la oss si at du har et objekt som åpnes av flere tråder. Du kan gjøre to ting for å unngå problemer."

"Den første er å bruke synkroniserte blokker for å pakke inn hvert sted der objektet er tilgjengelig. Men denne tilnærmingen fungerer kanskje ikke hvis en programmerer skriver kode som får tilgang til objektet direkte, uten en synkronisert blokk."

"Derfor brukes en andre tilnærming mesteparten av tiden - noe som gjør objektet trådsikkert." "Med andre ord er den synkroniserte mekanismen innebygd i selve objektet: den erklærer metodene synkroniserte og/eller pakker koden inn i metodene i synkroniserte blokker."

"Så ethvert objekt som jeg kan bruke fra flere tråder, og dette er nesten alle objekter i programmet, må jeg gjøre trådsikkert?"

"Generelt, ja. I virkeligheten brukes ikke alle objekter i et program av forskjellige tråder, men det er vanligvis mange. Så når du begynner å skrive kode for en tråd og får tilgang til forskjellige objekter fra den, så med hvert metodekall Du bør spørre deg selv: «Er denne samtalen trygg?»

"Sikker?"

"Trådsikker, som betyr at den trygt kan kalles fra flere tråder."

"Her er noen eksempler. Anta at du har et String-objekt som er tilgjengelig fra forskjellige tråder. Som du allerede skulle huske, er String uforanderlig - som alle andre primitive typer. Dette betyr at et objekt ikke endres etter at det er opprettet . Dette betyr at det er umulig å «knekke» et slikt objekt. Alle uforanderlige objekter er trådsikre."

"Vel, det gjør ting lettere."

"Nå, anta at du trenger en foranderlig streng."

"Ja, jeg husker. Det er to typer slike strenger: StringBuffer og StringBuilder. StringBuffer er som StringBuilder, men alle metodene er synkronisert. Er den også trådsikker?"

"Ja. Hvis du trenger tilgang til et StringBuilder-objekt fra flere tråder, må du erstatte det med en StringBuffer. Ellers vil trådene før eller siden endre det samtidig og «bryte» det."

"Hva om objektet som åpnes fra forskjellige tråder er et objekt av min egen klasse? Må jeg legge til synkroniserte metoder i dette tilfellet også?"

"Ja. Det er best å følge denne regelen: alle objekter som vil bli åpnet fra forskjellige tråder må være trådsikre."

"Jeg skjønner. Jeg trodde ikke at alt var så alvorlig. Takk, Ellie."

"Du er velkommen. Jeg håper disse tipsene vil hjelpe deg når Diego gir deg noen av de enkle oppgavene sine. ☺"