Utente:LoStrangolatore/Java/roba x Multithreading
Aspetto
Processo e thread
[modifica | modifica sorgente]C'è 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 | modifica sorgente]- 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 | modifica sorgente]- 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
[modifica | modifica sorgente]Il problema: un esempio
[modifica | modifica sorgente]La soluzione: le sezioni critiche
[modifica | modifica sorgente]La regola generale è: sincronizzare attorno alle risorse condivise.
Se non usi le sezioni critiche...
[modifica | modifica sorgente]Il 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
[modifica | modifica sorgente]Deadlock
[modifica | modifica sorgente]- 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 | modifica sorgente]- 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 | modifica sorgente]- link alla sottopagina