2010-10-11 10 views
0

Tous,Approche d'un programme thread-safe

Quelle devrait être l'approche pour écrire un programme thread-safe. Compte tenu d'une déclaration de problème, mon point de vue est:

1> Début de l'écriture du code pour un environnement à un seul thread.
2> Soulignez les domaines qui ont besoin atomicité et les remplacer par les classes simultanées possibles
3> Soulignez la section critique et les enfermer dans synchronisée
4> Effectuer un test pour les interblocages

Quelqu'un at-il des suggestions sur l'autre approches ou améliorations à mon approche. Jusqu'à présent, je peux me voir enfermer la plus grande partie du code dans des blocs synchronisés et je suis sûr que ce n'est pas correct.

Programmation en Java

Répondre

3

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/.

+0

+1 pour l'immuabilité. La minimisation de l'état inscriptible atténue de nombreux problèmes de concurrence. – ide

0

Toutes les variables (mémoire) accessible par plusieurs threads potentiellement en même temps, doivent être protégés par un mécanisme de synchronisation.

1

Vous devez utiliser finale et immuables champs autant que possible, d'autres données que vous souhaitez modifier ajouter à l'intérieur:

synchronized (this) { 
    // update 
    } 

Et rappelez-vous, parfois freins choses, et si cela arrive, vous n ne pas vouloir prolonger l'exécution du programme en prenant toutes les mesures possibles pour le contrer - au lieu de "fail fast".

1

Comme vous l'avez demandé à propos de la sécurité des threads et non des performances concurrentes, votre approche est essentiellement sonore. Toutefois, un programme thread-safe qui utilise la synchronisation ne s'échelonne probablement pas beaucoup dans un environnement multi-cpu avec n'importe quel niveau de contention sur votre structure/programme.Personnellement, j'aime essayer d'identifier les changements d'état de plus haut niveau et essayer de les rendre atomiques, et faire passer les changements d'état d'un état immuable à un autre - copier-sur-écrire si vous voulez. L'écriture proprement dite peut alors être une opération de comparaison et de définition sur une variable atomique ou une mise à jour synchronisée, ou quelle que soit la stratégie qui fonctionne le mieux (à condition qu'elle publie le nouvel état en toute sécurité).

Cela peut être un peu difficile à structurer si votre nouvel état est assez différent (nécessite des mises à jour de plusieurs champs par exemple), mais j'ai vu très bien résoudre les problèmes de performance simultanés avec accès synchronisé.

1

Achetez et lisez «Java Concurrency in Practice» de Brian Goetz.