Brug af synkroniseret - 1

"Hej, Amigo!"

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

"I dag vil jeg fortælle dig om at bruge synkroniseret i praksis."

"Når et program har mange objekter og tråde, sker det ofte, at flere tråde arbejder med det samme objekt samtidigt. Derved forstyrrer trådene hinanden."

"Ja, det ved jeg allerede."

"Så lad os sige, at du har et objekt, der tilgås af flere tråde. Du kan gøre to ting for at undgå problemer."

"Den første er at bruge synkroniserede blokke til at ombryde hvert sted, hvor objektet er tilgået. Men denne tilgang virker muligvis ikke, hvis en programmør skriver kode, der tilgår objektet direkte, uden en synkroniseret blok."

"Derfor bruges en anden tilgang det meste af tiden - hvilket gør objektet trådsikkert." "Med andre ord er den synkroniserede mekanisme indbygget i selve objektet: den erklærer dens metoder synkroniseret og/eller pakker koden ind i dens metoder i synkroniserede blokke."

"Så ethvert objekt, som jeg kan bruge fra flere tråde, og dette er næsten alle objekter i programmet, skal jeg gøre trådsikkert?"

"Generelt, ja. I virkeligheden bruges ikke alle objekter i et program af forskellige tråde, men der er normalt mange. Så når du begynder at skrive kode til en tråd og får adgang til forskellige objekter fra den, så med hvert metodekald du bør spørge dig selv, «Er dette opkald sikkert?»

"Sikker?"

"Trådsikker, hvilket betyder, at den sikkert kan kaldes fra flere tråde."

"Her er nogle eksempler. Antag, at du har et String-objekt, der tilgås fra forskellige tråde. Som du allerede skulle huske, er String uforanderlig - ligesom alle andre primitive typer. Det betyder, at et objekt ikke ændres, efter det er oprettet . Det betyder, at det er umuligt at «knække» et sådant objekt. Alle uforanderlige objekter er trådsikre."

"Nå, det gør tingene nemmere."

"Antag nu, at du har brug for en foranderlig streng."

"Ja, jeg kan huske. Der er to slags sådanne strenge: StringBuffer og StringBuilder. StringBuffer er ligesom StringBuilder, men alle dens metoder er synkroniserede. Er den også trådsikker?"

"Ja. Hvis du har brug for at få adgang til et StringBuilder-objekt fra flere tråde, skal du erstatte det med en StringBuffer. Ellers vil trådene før eller siden ændre det på samme tid og "bryde" det."

"Hvad hvis objektet, der tilgås fra forskellige tråde, er et objekt af min egen klasse? Skal jeg også tilføje synkroniseret til dets metoder i dette tilfælde?"

"Ja. Det er bedst at følge denne regel: alle objekter, der vil blive tilgået fra forskellige tråde, skal være trådsikre."

"Jeg forstår det. Jeg troede ikke, at alt var så alvorligt. Tak, Ellie."

"Du er velkommen. Jeg håber, at disse tips vil hjælpe dig, når Diego giver dig et par af sine nemme opgaver. ☺"