Como todos sabemos, Vector y Hashtable son seguros en Java. Por lo tanto, no habrá problemas en la operación de vector y hashtable. Pero hay una situación: cuando se copia un hashtable a otro hashtable, si se utiliza la flor del método Putall, se lanzará un java.util.concurrentModificationException. Primero cargue el código:
TestSync.Java
La copia del código es la siguiente:
clase pública testSync
{
/**
* Main (uso una oración para describir la función de este método)
* (Las condiciones aplicables para este método se describen aquí)
* @param args
* @return void
* @excepción
* @Since 1.0.0
*/
Public static void main (String [] args)
{
Map <integer, user> list = new Hashtable <Integer, user> ();
Lista <serem> vec = new Vector <serer> ();
TestThread Thread = new TestThread ();
Thread.Start ();
int i = 0;
mientras (i <1000)
{
i ++;
System.out.println ("iiiiiiiiiiii = -------------------" + i);
list.clear ();
vec.Clear ();
// vector y hashtable son hiladrados, y la implementación de los dos conjuntos en el método Putall es diferente
vec.addall (constans.uservec);
// sincronizado (constans.userlist)
// {
list.putall (constans.userList);
//}
System.out.println ("---------" + list.size ());
System.out.println ("---------" + vec.size ());
}
System.out.println ("Over ------------------------------------------ --- ");
}
}
Constans de clase
{
Mapa estático público <Integer, usuario> userList = new Hashtable <Integer, user> ();
Lista estática pública <serem> uservec = new Vector <serer> ();
}
Hilo de clases TestThread extiende
{
@Anular
Public void run ()
{
para (int i = 0; i <100000; i ++)
{
Usuario user = nuevo usuario ();
user.setID (i);
user.setName ("Nombre" + I);
if (! constans.userlist.containskey (i))
{
Constans.userlist.put (i, usuario);
Constans.uservec.add (usuario);
}
}
System.out.println ("End de hilo ----------------------------------------- -------------------------------------------------- -----------------------
}
}
Cuando lo haremos
La copia del código es la siguiente:
// sincronizado (constans.userlist)
// {
list.putall (constans.userList);
//}
Cuando no se utiliza la sincronización, se devuelve una excepción. Es porque Constans.userList no está sincronizado, en lugar de que el método Putall no sea seguro.
La diferencia entre Vector y Hashtable es que el método Addall del vector puede ejecutarse normalmente sin sincronización.
User.java
La copia del código es la siguiente:
Usuario de clase pública
{
ID privado int;
nombre de cadena privada;
Public int getId ()
{
ID de retorno;
}
Public void setid (int id)
{
this.id = id;
}
Public String getName ()
{
nombre de retorno;
}
Public void setName (nombre de cadena)
{
this.name = name;
}
}
No estoy escribiendo bien, todos me perdonan.