2009-10-14 7 views

Répondre

8

Le code doit être synchronisé lorsqu'il peut y avoir plusieurs threads qui travaillent sur les mêmes données en même temps.

Si le code doit être synchronisé n'est pas quelque chose que vous pouvez découvrir par test unitaire. Vous devez penser et concevoir votre programme avec soin lorsque votre programme est multi-thread pour éviter les problèmes.

Un bon livre sur la programmation simultanée en Java est Java Concurrency in Practice.

+2

+1: la conception doit tenir compte de concurrence. Vous ne découvrirez probablement pas tous les endroits où vous devez synchroniser avec les tests. Au lieu de cela, vous allez implémenter un système qui a tendance à tomber sous une charge importante. –

+0

+1 pour «ce n'est pas quelque chose que vous pouvez découvrir à l'aide de tests unitaires», bien que vous puissiez trouver une petite proportion de failles lors de tests lourds. –

3

Ceci est une bonne source pour des informations générales: http://weblogs.java.net/blog/caroljmcdonald/archive/2009/09/17/some-java-concurrency-tips

Lorsque vous êtes dans un environnement multithread en Java et que vous voulez faire beaucoup de choses en parallèle, je suggère d'utiliser une approche qui utilise la file d'attente concurrente (comme BlockingQueue ou ConcurrentLinkedQueue) implémentations et un Runnable simple qui a une référence à la file d'attente et tire «messages» de la file d'attente. Utilisez un ExecutorService pour gérer les tâches. Tri d'un type d'acteur (très simplifié). Choisissez donc de ne pas partager l'état autant que possible, car si vous le faites, vous devez synchroniser ou utiliser une structure de données qui prend en charge l'accès simultané comme le ConcurrentHashMap.

3

Si je comprends bien votre question, vous voulez savoir ce que vous devez synchroniser. Malheureusement, il n'y a pas de code de plaque de chaudière à fournir qui vous montre ce qu'il faut synchroniser - vous devriez jeter un oeil aux méthodes et aux variables d'instance auxquelles plusieurs threads peuvent accéder en même temps. S'il n'y en a pas, vous n'avez généralement pas à vous soucier trop de la synchronisation.

1

Il n'y a pas de substitut à la réflexion sur les questions entourant votre code (comme les autres réponses illustrent ici). Une fois que vous avez fait cela, cependant, il vaut la peine de courir FindBugs sur votre code. Il identifiera où vous avez appliqué la synchronisation de façon incohérente, et est une aide précieuse dans le suivi des bogues autrement difficiles à trouver.

0

Oui, tous ces gens ont raison - pas d'alternative pour penser. Mais voici la règle du pouce .. 1. Si l'une lecture - peut-être vous n'avez pas besoin de synchronisation 2. Si l'une « écriture » - vous devriez considérer ...

Questions connexes