Utente:LoStrangolatore/Java/roba x Multithreading
Processo e thread
modificaC'è un solo processo che fa da "contenitore" per un numero arbitrario di thread... Thread daemon e non-daemon...
Motivazioni: la necessità di usare i thread
modifica- eseguire più compiti
- eseguire più compiti contemporaneamente
- minimizzare i tempi morti: l'efficacia massima dei thread si ha quando sono impegnati ad aspettare con risorse diverse
- permettere alla GUI di rispondere (+ link verso Java/AWT e Swing)
Regole dei thread
modifica- non si fa alcuna garanzia sulla tempistica di esecuzione del codice di un thread, ovvero la JVM può interrompere e riprendere il codice in qualunque momento in modo completamente arbitrario.
Sincronizzazione
modificaIl problema: un esempio
modificaLa soluzione: le sezioni critiche
modificaLa regola generale è: sincronizzare attorno alle risorse condivise.
Se non usi le sezioni critiche...
modificaIl mio codice sembra "thread-safe", ma in realtà non usa le sezioni critiche, beh, ma cosa mai potrà succedere di male?
- la JLS definisce alcune operazioni come atomiche, tuttavia senza synchronized non si garantisce che i thread risincronizzino la memoria tra di loro (cioè che uno veda gli effetti dell'altro), il che può portare a risultati inconsistenti
- instruction reordering da parte del compilatore (cioè quella cosa che il sorgente di un metodo viene compilato a meno di riordinamenti che preservino il funzionamento del codice di quel metodo se non eseguito in concorrenza con alcun altro thread)
Soluzione alternativa: volatile
modificaDeadlock
modifica- cos'è
- consigli x evitarlo (mettendoci le rispettive fonti)
- sincronizzare su lock che non sono visti da altre classi (pertanto non sincronizzare su this) (se non sbaglio, questo consiglio l'ho letto proprio sul sito della Sun: se è così, metterci la fonte)
- sincronizzare attorno a codice che non esce fuori dalla classe (metodi overrideable o di altre classi)
Consigli vari
modifica- stare attenti quando si mischiano ereditarietà e multithreading
- documentare le caratteristiche di ogni classe/interfaccia relativamente al multithreading (= se lo supporta o no), così sarà più facile metterle insieme e avere un punto di riferimento chiaro quando entrerà in gioco il multithreading
Double-checked locking
modifica- link alla sottopagina