2014-05-21 1 views
0

Je souhaite reproduire un scénario dans lequel deux threads accèdent à une HashMap partagée. Alors qu'un thread copie le contenu de la map partagée dans localMap en utilisant l'opération putAll(), le second thread modifie la map partagée et CocurrentModificationException doit être lancé.comment interrompre l'opération putAll au milieu pour générer ConcurrentModificationException

J'ai essayé mais je n'ai pas pu reproduire l'exception au moment où l'opération putAll est en cours. Chaque fois que putAll est terminé avant que l'autre thread ne soit modifié ou que putAll soit appelé après une autre modification de thread.

Quelqu'un peut-il suggérer comment puis-je générer le scénario en Java?

Merci.

Répondre

0

Faites tourner les deux filetages et faites-les fonctionner en continu.

Avoir un thread faisant constamment putAll, l'autre faisant constamment la modification.

0
import java.util.HashMap; 
import java.util.Map; 

public class Example { 
    private final HashMap<String, String> map = new HashMap<String, String>(); 

    public static void main(String[] args) { 
     new Example(); 
    } 

    public Example() { 
     Thread thread1 = new Thread(new Runnable() { 
      @Override 
      public void run() { 
       int counter = 0; 
       while (true) { 
        Map<String, String> tmp = new HashMap<String, String>(); 
        tmp.put("example" + counter, "example"); 
        counter++; 
        map.putAll(tmp); 
       } 
      } 
     }); 

     Thread thread2 = new Thread(new Runnable() { 
      @Override 
      public void run() { 
       while (true) { 
        map.values().remove("example"); 
       } 
      } 
     }); 

     thread1.start(); 
     thread2.start(); 
    } 
} 

Malheureusement, je ne peux pas copier/coller le code de fonctionnement directement à partir de mon poste de travail actuel, donc je retapé ici donc il pourrait y avoir une erreur de frappe.

Comme vous pouvez le constater, le premier thread ajoute continuellement des valeurs tandis que le second thread itère sur les valeurs de la carte. Quand il commence à itérer sur les valeurs, il attend un certain nombre de valeurs (cette valeur est initialisée lors de la construction de l'itérateur). Cependant, étant donné que thread1 ajoute continuellement des éléments, cette valeur n'est pas celle attendue lorsque l'Iterator vérifie la quantité réelle de valeurs qui se trouvent dans la carte lorsqu'il exécute le code de suppression. Cela provoque l'exception ConcurrentModificationException.

0

Si vous avez juste besoin d'un CocurrentModificationException à être jeté, vous pouvez mettre en œuvre votre propre implémentation Map (HackedMap) pour supprimer les éléments de la HashMap lorsque le HashMap essaie de copier les valeurs de votre HackedMap