"Ciao, Amico!"
"Sì, sono qui, sono qui."
"Oggi ti parlerò dell'uso della sincronizzazione nella pratica."
"Quando un programma ha molti oggetti e thread, accade spesso che più thread lavorino simultaneamente con lo stesso oggetto. In tal modo, i thread interferiscono tra loro."
"Sì, questo lo so già."
"Quindi, supponiamo che tu abbia accesso a un oggetto da più thread. Puoi fare due cose per evitare problemi."
"Il primo è utilizzare blocchi sincronizzati per avvolgere ogni posizione in cui si accede all'oggetto. Ma questo approccio potrebbe non funzionare se qualche programmatore scrive codice che accede direttamente all'oggetto, senza un blocco sincronizzato."
"Pertanto, la maggior parte delle volte viene utilizzato un secondo approccio: rendere l'oggetto thread-safe." "In altre parole, il meccanismo sincronizzato è incorporato nell'oggetto stesso: dichiara i suoi metodi sincronizzati e/o avvolge il codice all'interno dei suoi metodi in blocchi sincronizzati."
"Quindi qualsiasi oggetto che potrei usare da più thread, e questo è quasi tutti gli oggetti nel programma, devo renderlo thread-safe?"
"In generale, sì. In realtà, non tutti gli oggetti in un programma sono usati da thread diversi, ma di solito ce ne sono molti. Quindi, quando inizi a scrivere codice per un thread e accedi a vari oggetti da esso, allora con ogni metodo chiama dovresti chiederti: «Questa chiamata è sicura?»"
"Sicuro?"
"Thread-safe, il che significa che può essere tranquillamente chiamato da più thread."
"Ecco alcuni esempi. Supponi di avere un oggetto String a cui si accede da thread diversi. Come dovresti già ricordare, String è immutabile , come lo sono tutti gli altri tipi primitivi. Ciò significa che un oggetto non cambia dopo che è stato creato . Ciò significa che è impossibile «rompere» un tale oggetto. Tutti gli oggetti immutabili sono thread-safe."
"Beh, questo rende le cose più facili."
"Ora, supponi di aver bisogno di una stringa mutabile."
"Sì, ricordo. Esistono due tipi di tali stringhe: StringBuffer e StringBuilder. StringBuffer è come StringBuilder, ma tutti i suoi metodi sono sincronizzati. È anche thread-safe?"
"Sì. Se devi accedere a un oggetto StringBuilder da più thread, devi sostituirlo con uno StringBuffer. Altrimenti, prima o poi i thread lo cambieranno contemporaneamente e lo «romperanno»."
"Cosa succede se l'oggetto a cui si accede da thread diversi è un oggetto della mia stessa classe? Devo aggiungere sincronizzato anche ai suoi metodi in questo caso?"
"Sì. È meglio seguire questa regola: tutti gli oggetti a cui si accederà da thread diversi devono essere thread-safe."
"Capisco. Non pensavo che fosse tutto così serio. Grazie, Ellie."
"Prego. Spero che questi suggerimenti ti saranno d'aiuto quando Diego ti darà alcuni dei suoi compiti facili. ☺"
GO TO FULL VERSION