Threading/les problèmes de simultanéité sont notoirement difficile à reproduire, qui est l'une des raisons pour lesquelles vous devriez conception pour éviter ou au moins minimiser les probabilités. C'est la raison des objets immuables, sont si précieux. Essayez d'isoler les objets mutables à un seul fil, et ensuite soigneusement le contrôle de l'échange d'objets mutables entre les threads. Tenter de programme avec une conception de l'objet en mains, plutôt que de "partagé" des objets. Pour ce dernier, l'utilisation de synchroniser les objets de contrôle (qui sont plus faciles à raison), et éviter d'avoir un objet synchronisé d'utiliser d'autres objets qui doivent également être synchronisés, qui est, essayez de les garder autonome. Votre meilleure défense est une bonne conception.
Les blocages sont le plus facile à déboguer, si vous pouvez obtenir une trace de la pile lors de l'impasse. Compte tenu de la trace, dont la plupart ne détection de blocage, il est facile d'identifier la raison et alors raison à propos du code de pourquoi et de comment le résoudre. Avec les blocages, il va toujours être un problème d'acquérir les mêmes verrous dans des ordres différents.
Vivre les verrous sont plus difficile d'être en mesure d'observer le système, tandis que dans l'état d'erreur est votre meilleur pari là.
Des conditions de course ont tendance à être extrêmement difficile à reproduire, et encore plus difficiles à identifier, à partir de l'analyse manuelle du code. Avec ces derniers, le chemin que j'ai l'habitude de prendre, en plus de nombreux tests à reproduire, est à la raison de ces possibilités, et essayez d'ouvrir une session d'information pour prouver ou réfuter des théories. Si vous avez des preuves directes de la corruption de l'état, vous pourriez être en mesure de raisonner sur les causes possibles basées sur la corruption.
Le plus complexe, le système, plus il est difficile de trouver de la simultanéité des erreurs, et à raison, sur son comportement. Utilisez des outils comme JVisualVM et connexion à distance profileurs - ils peuvent être un épargnant de vie si vous pouvez vous connecter à un système dans un état d'erreur et d'inspecter les fils et les objets.
Aussi, méfiez-vous des différences de comportement qui sont fonction du nombre de cœurs du PROCESSEUR, de pipelines, de la bande passante du bus, etc. Les changements dans le matériel peut affecter votre capacité à reproduire le problème. Certains problèmes ne montrent sur single-core CPU d'autres seulement sur multi-cœurs.
Une dernière chose, essayez d'utiliser la simultanéité des objets distribués avec le système de bibliothèques - e.g en Java java.util.simultanées est votre ami. La rédaction de votre propre contrôle de la simultanéité des objets est difficile et lourde de danger; laisser les experts, si vous avez un choix.