L'écriture d'un code multithread correct est difficile, et il n'y a pas de formule magique ou d'ensemble d'étapes qui vous y mèneront. Mais, il y a quelques directives que vous pouvez suivre.
Personnellement, je ne commencerais pas à écrire du code pour un environnement à un seul thread, puis à le convertir en multithread. Un bon code multithread est conçu avec le multi-thread à l'esprit dès le départ. L'atomicité des champs n'est qu'un élément du code concurrent.
Vous devez choisir les zones du code qui doivent être multithread (dans une application multithread, il n'est généralement pas nécessaire d'utiliser threadsafe). Ensuite, vous devez concevoir comment ces sections seront threadsafe. Les méthodes de création d'une zone du threadsafe de code peuvent être différentes de celles qui rendent d'autres zones différentes. Par exemple, il est important de comprendre s'il y aura un volume important de lecture ou d'écriture et cela pourrait affecter les types de verrous utilisés pour protéger les données.
L'immunité est également un élément clé du code threadsafe. Lorsque les éléments sont immuables (c'est-à-dire qu'ils ne peuvent pas être modifiés), vous n'avez pas à vous soucier de plusieurs threads qui les modifient puisqu'ils ne peuvent pas être modifiés. Cela peut grandement simplifier les problèmes de sécurité des threads et vous permettre de vous concentrer sur l'emplacement de plusieurs lecteurs et rédacteurs de données.
La compréhension des détails de la simultanéité dans Java (et des détails du modèle de mémoire Java) est très importante. Si vous n'êtes pas familier avec ces concepts, je vous recommande de lire Java Concurrency In Practice http://www.javaconcurrencyinpractice.com/.
+1 pour l'immuabilité. La minimisation de l'état inscriptible atténue de nombreux problèmes de concurrence. – ide