Använda synkroniserad - 1

"Hej, Amigo!"

"Ja, jag är här, jag är här."

"Idag kommer jag att berätta om hur du använder synkroniserat i praktiken."

"När ett program har många objekt och trådar händer det ofta att flera trådar arbetar med samma objekt samtidigt. Därigenom stör trådarna varandra."

"Ja, jag vet redan det här."

"Så, låt oss säga att du har ett objekt som nås av flera trådar. Du kan göra två saker för att undvika problem."

"Den första är att använda synkroniserade block för att omsluta varje plats där objektet nås. Men det här tillvägagångssättet kanske inte fungerar om någon programmerare skriver kod som kommer åt objektet direkt, utan ett synkroniserat block."

"Därför används en andra metod för det mesta - vilket gör objektet trådsäkert." "Med andra ord är den synkroniserade mekanismen inbyggd i själva objektet: den förklarar dess metoder synkroniserade och/eller lindar koden inuti sina metoder i synkroniserade block."

"Så alla objekt som jag kan använda från flera trådar, och det här är nästan alla objekt i programmet, måste jag göra trådsäkert?"

"I allmänhet, ja. I verkligheten används inte alla objekt i ett program av olika trådar, men det finns vanligtvis många. Så när du börjar skriva kod för en tråd och kommer åt olika objekt från den, då med varje metodanrop du bör fråga dig själv, "Är det här samtalet säkert?"

"Säker?"

"Trådsäker, vilket innebär att det säkert kan anropas från flera trådar."

"Här är några exempel. Anta att du har ett String-objekt som nås från olika trådar. Som du redan skulle komma ihåg, är String oföränderlig - liksom alla andra primitiva typer. Det betyder att ett objekt inte ändras efter att det skapats . Detta betyder att det är omöjligt att "bryta" ett sådant föremål. Alla oföränderliga föremål är trådsäkra."

"Tja, det gör det lättare."

"Anta nu att du behöver en föränderlig sträng."

"Ja, jag kommer ihåg. Det finns två typer av sådana strängar: StringBuffer och StringBuilder. StringBuffer är som StringBuilder, men alla dess metoder är synkroniserade. Är den också trådsäker?"

"Ja. Om du behöver komma åt ett StringBuilder-objekt från flera trådar måste du ersätta det med en StringBuffer. Annars kommer trådarna förr eller senare att ändra det samtidigt och "bryta" det."

"Vad händer om objektet som nås från olika trådar är ett objekt av min egen klass? Behöver jag lägga till synkroniserade till dess metoder också i det här fallet?"

"Ja. Det är bäst att följa denna regel: alla objekt som kommer att nås från olika trådar måste vara trådsäkra."

"Jag förstår. Jag trodde inte att allt var så allvarligt. Tack, Ellie."

"Du är välkommen. Jag hoppas att dessa tips kommer att hjälpa dig när Diego ger dig några av sina enkla uppgifter. ☺"