2010-07-07 4 views
2

J'ai deux threads et un classe. Thread1 met à jour l'objet local de la classe via 3 méthodes différentes. L'objet local (derrière la scène) utilise une sorte de ArrayList pour stocker des données. Trois méthodes (mentionnées précédemment), font quelque chose avec des éléments de la liste ...Problème de synchronisation Java

Thread2 interroge l'objet local (contenu de la liste de tableaux).

PROBLÈME: Comment puis-je m'assurer qu'aucune des trois méthodes de mise à jour (Thread1) ne modifie le contenu de "l'objet local" pendant qu'il est lu par Thread2?

Merci

Répondre

1

Placez un verrou commun autour des parties du code qui modifient ArrayList à l'aide synchronisé. Il ne compte pas vraiment quel objet que vous utilisez comme un verrou, tant qu'il est la même chose, mais je pense en utilisant le ArrayList lui-même serait idiomatiques:

synchronized (list) { 
    list.put()... 
} 

synchronized (list) { 
    list.get()... 
} 
+0

semble logique de mee! J'essaierai! – user318247

+0

Si une méthode lit dans la liste puis la modifie en fonction de ce qu'elle a lu, vous avez besoin d'un bloc autour des deux méthodes. –

+0

Dois-je mettre synchronisé même si je redis les données ... pour m'assurer qu'aucune modification n'est faite pendant que je termine la lecture? – user318247

0

Vous pouvez faire les méthodes qui ont accès aux données (lecture ou écriture) « synchronisée ».

+0

Voulez-vous dire les méthodes de «l'objet local» ou les méthodes de la classe? – user318247

0

Dans toutes les méthodes mentionnées ci-dessus, utilisez un contexte synchronized(your_list) { ... code ... }, ce qui rend les méthodes synchronized peut être une solution peut-être à difficile, bloque plus que nécessaire si vous voulez juste protéger la liste et non l'objet entier.

0

utilisant le mot clé synchronized. Vous avez affaire à un problème connu sous le nom critical sections

Questions connexes