Comme nous le savons tous, le vecteur et le hashtable sont des filetages en Java. Par conséquent, il n'y aura aucun problème dans le fonctionnement du vecteur et du hachage. Mais il y a une situation: lors de la copie d'un hachage à un autre hashtable, si la fleur de la méthode Putall est utilisée, une conception java.util.concurrentmodificationxception sera lancée. Téléchargez d'abord le code:
TestSync.java
La copie de code est la suivante:
classe publique TestSync
{
/ **
* Main (j'utilise une phrase pour décrire la fonction de cette méthode)
* (Les conditions applicables pour cette méthode sont décrites ici)
* @param args
* @return void
* @exception
* @Since 1.0.0
* /
public static void Main (String [] args)
{
Map <nteger, user> list = new hashTable <nteger, user> ();
List <ser user> vec = new vector <server> ();
TestThread Thread = new TestThread ();
thread.start ();
int i = 0;
tandis que (i <1000)
{
i ++;
System.out.println ("iiiiiiiiiii = -------------------" + i);
list.clear ();
Vec.Clear ();
// vecteur et hashtable sont en filetage, et l'implémentation des deux ensembles dans la méthode Putall est différente
Vec.addall (constans.Usererc);
// synchronisé (constans.userlist)
// {
list.putall (constans.userList);
//}
System.out.println ("---------" + list.size ());
System.out.println ("---------" + ve.size ());
}
System.out.println ("Over ------------------------------------------ --- ");
}
}
classe Constans
{
public static map <Integer, user> userList = new hashTable <Integer, user> ();
Liste statique publique <User> userVec = new Vector <User> ();
}
Class TestThread étend le fil
{
@Outrepasser
public void run ()
{
pour (int i = 0; i <100000; i ++)
{
Utilisateur utilisateur = nouveau utilisateur ();
user.setid (i);
user.setName ("name" + i);
if (! constans.userlist.containskey (i))
{
Constans.userList.put (i, utilisateur);
Constans.Usererc.add (utilisateur);
}
}
System.out.println ("Tire End ----------------------------------------- -------------------------------------------------- -----------------------
}
}
Quand nous le ferons
La copie de code est la suivante:
// synchronisé (constans.userlist)
// {
list.putall (constans.userList);
//}
Lorsque la synchronisation n'est pas utilisée, une exception est rejetée. C'est parce que Constans.UserList n'est pas synchronisé, plutôt que la méthode Putall n'est pas sûre.
La différence entre le vecteur et le hachage est que la méthode d'addition du vecteur peut s'exécuter normalement sans synchronisation.
User.java
La copie de code est la suivante:
utilisateur de classe publique
{
INT PRIVÉ ID;
nom de chaîne privé;
public int getID ()
{
Retour ID;
}
public void setid (int id)
{
this.id = id;
}
public String getName ()
{
nom de retour;
}
public void setName (nom de chaîne)
{
this.name = name;
}
}
Je n'écris pas bien, tout le monde me pardonne.