"Ciao, Amigo! Ieri abbiamo discusso dei vantaggi e delle comodità del multithreading. Ora è il momento di esaminare gli svantaggi. E, sfortunatamente, non sono piccoli."
In precedenza, abbiamo considerato un programma come un insieme di oggetti che richiamano i metodi l'uno dell'altro. Ora tutto diventa un po' più complicato. Un programma è più simile a un insieme di oggetti che ha diversi "piccoli robot" (thread) che strisciano attraverso di esso ed eseguono i comandi contenuti nei metodi.
Questa nuova interpretazione non annulla la prima. Sono ancora oggetti e chiamano ancora i metodi l'uno dell'altro. Ma dobbiamo ricordare che ci sono diversi thread e ogni thread svolge il proprio lavoro o compito.
Un programma sta diventando più complicato. Thread diversi modificano lo stato di oggetti diversi in base alle attività che eseguono. E possono pestarsi i piedi a vicenda.
Ma le cose peggiori accadono nel profondo della macchina Java. Come ho già detto, l'apparente simultaneità dei thread è ottenuta dal fatto che il processore passa costantemente da un thread all'altro. Passa a un thread, funziona per 10 millisecondi, passa al thread successivo, funziona per 10 millisecondi e così via. E qui sta il problema: questi cambi possono avvenire nei momenti più inopportuni. Considera questo esempio:
Codice del primo thread | Codice del secondo thread |
---|---|
|
|
Cosa ci aspettavamo di essere visualizzato |
---|
Nick ha 15 anni Lena ha 21 anni |
Esecuzione effettiva del codice | Codice del primo thread | Codice del secondo thread |
---|---|---|
|
|
|
Cosa viene effettivamente visualizzato |
---|
Nick è Lena ha 15 21 anni |
Ed ecco un altro esempio:
Codice | Descrizione |
---|---|
|
Il metodo scambia swap i valori delle variabili name1 e name2 .
Cosa potrebbe accadere se viene chiamato da due thread contemporaneamente? |
Esecuzione effettiva del codice | Codice del primo thread | Codice del secondo thread |
---|---|---|
|
|
|
La linea di fondo |
---|
Entrambe le variabili hanno il valore «Lena». L'oggetto «Alleato» non ce l'ha fatta. È perso. |
"Chi avrebbe mai immaginato che errori come questo fossero possibili con un'operazione di assegnazione così semplice?!"
"Sì, questo problema ha una soluzione. Ma ne parleremo un po' più tardi: ho la gola secca."
GO TO FULL VERSION