Gesynchroniseerd gebruiken - 1

"Hallo Amigo!"

"Ja, ik ben hier, ik ben hier."

"Vandaag zal ik je vertellen over het gebruik van gesynchroniseerd in de praktijk."

"Als een programma veel objecten en threads heeft, gebeurt het vaak dat meerdere threads tegelijkertijd met hetzelfde object werken. De threads interfereren daarbij met elkaar."

"Ja, dat weet ik al."

"Dus, laten we zeggen dat je een object hebt dat wordt benaderd door meerdere threads. Je kunt twee dingen doen om problemen te voorkomen."

"De eerste is om gesynchroniseerde blokken te gebruiken om elke locatie waar het object wordt benaderd in te pakken. Maar deze aanpak werkt mogelijk niet als een programmeur code schrijft die rechtstreeks toegang heeft tot het object, zonder een gesynchroniseerd blok."

"Daarom wordt meestal een tweede benadering gebruikt: het object thread-safe maken." "Met andere woorden, het gesynchroniseerde mechanisme is ingebouwd in het object zelf: het verklaart zijn methoden gesynchroniseerd en/of wikkelt de code in zijn methoden in gesynchroniseerde blokken."

"Dus elk object dat ik zou kunnen gebruiken uit meerdere threads, en dit zijn bijna alle objecten in het programma, moet ik thread-safe maken?"

"In het algemeen wel. In werkelijkheid worden niet alle objecten in een programma door verschillende threads gebruikt, maar er zijn er meestal veel. je moet jezelf afvragen: «Is dit gesprek veilig?»"

"Veilig?"

"Thread-safe, wat betekent dat het veilig kan worden aangeroepen vanuit meerdere threads."

"Hier zijn enkele voorbeelden. Stel dat je een String-object hebt dat toegankelijk is vanuit verschillende threads. Zoals je je al had moeten herinneren, is String onveranderlijk - net als alle andere primitieve typen. Dit betekent dat een object niet verandert nadat het is gemaakt . Dit betekent dat het onmogelijk is om zo'n object te "breken". Alle onveranderlijke objecten zijn thread-safe."

"Nou, dat maakt het makkelijker."

"Nu, stel dat je een veranderlijke string nodig hebt."

"Ja, dat weet ik nog. Er zijn twee soorten strings: StringBuffer en StringBuilder. StringBuffer lijkt op StringBuilder, maar alle methodes zijn gesynchroniseerd. Is het ook thread-safe?"

"Ja. Als je toegang nodig hebt tot een StringBuilder-object vanuit meerdere threads, moet je het vervangen door een StringBuffer. Anders zullen de threads het vroeg of laat tegelijkertijd veranderen en het "breken".

"Wat als het object waartoe toegang wordt verkregen vanuit verschillende threads een object van mijn eigen klasse is? Moet ik in dit geval ook gesynchroniseerd aan zijn methoden toevoegen?"

"Ja. Het is het beste om deze regel te volgen: alle objecten waartoe toegang wordt verkregen vanuit verschillende threads moeten thread-safe zijn."

'Ik snap het. Ik dacht niet dat alles zo serieus was. Bedankt, Ellie.'

"Graag gedaan. Ik hoop dat deze tips je zullen helpen wanneer Diego je een paar van zijn gemakkelijke taken geeft. ☺"