Non ci hai detto che tipo di multi-threading fai, ma presumo che tu faccia multi-threading del tipo di lock, (tu usi la parola chiave synchronized
di java,) altrimenti probabilmente non chiederei al domanda.
Dal momento che i test hanno guadagnato terreno nella disciplina dell'ingegneria del software negli ultimi dieci anni circa, il multi-threading del tipo di chiusura è caduto dal favore in proporzione. Questo perché il codice multi-threading del tipo di blocco non può essere realmente testato.
Invece, la linea moderna di pensiero rispetto al multi-threading è preferire meccanismi che eliminino le dipendenze tra i thread. In questo modo, il codice può essere testato correttamente in modo sequenziale ed è (specie) garantito il funzionamento quando viene inserito in thread paralleli, poiché i thread paralleli non dipendono l'uno dall'altro.
Uno strumento molto importante per ottenere questo risultato è message passing . Ciò significa che ogni thread riceve i dati per operare in una coda di messaggi e invia i dati elaborati attraverso un'altra coda di messaggi. I messaggi sono oggetti immutabili, quindi è impossibile che un thread modifichi inavvertitamente il contenuto di un messaggio, causando il danneggiamento in un thread diverso. Essenzialmente, il blocco è ancora utilizzato, ma è localizzato in una sola piccola classe, la classe che implementa la coda dei messaggi effettiva, che si può tranquillamente presumere essere già accuratamente testata e perfettamente funzionante.
Se hai un sacco di dati da elaborare, potresti pensare che raccoglierlo e impacchetterlo in oggetti immutabili e metterlo in coda potrebbe rappresentare un sovraccarico significativo, ma in realtà questo tende a essere sfalsato (a volte notevolmente offset) dal fatto che una volta che un thread ha una porzione di dati da elaborare, può funzionare senza doverlo bloccare continuamente. Vedete, ogni volta che provate a bloccare qualcosa che accade già bloccato da un altro thread, il vostro thread viene posto in uno stato di attesa, che è una penalità enorme per le prestazioni.