Como todos sabemos, o vetor e a hashtable são seguros de threads em Java. Portanto, não haverá problemas na operação de vetor e hashtable. Mas há uma situação: ao copiar uma hashtable para outra hashtable, se a flor do método Putall for usada, um java.util.ConcurrentModificationException será lançado. Primeiro, envie o código:
Testsync.java
A cópia do código é a seguinte:
Classe pública TestSync
{
/**
* Main (eu uso uma frase para descrever a função deste método)
* (As condições aplicáveis para este método são descritas aqui)
* @param args
* @return void
* @Exception
* @since 1.0.0
*/
public static void main (string [] args)
{
Mapa <Inteiro, usuário> list = new Hashtable <Integer, Usuário> ();
List <suser> Vec = novo vetor <suser> ();
Thread TestThread = new TestThread ();
thread.start ();
int i = 0;
enquanto (i <1000)
{
i ++;
System.out.println ("iiiiiiiiiiii = -------------------" + i);
list.clear ();
vec.clear ();
// vetor e hashtable são seguros de threads, e a implementação dos dois conjuntos no método Putall é 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 ---------------------------------------------- --- ");
}
}
Classe Constans
{
mapa estático público <Inteiro, usuário> userList = new Hashtable <Integer, usuário> ();
Lista estática pública <suário> userVec = new Vector <sufers> ();
}
Classe testthread estende thread
{
@Override
public void run ()
{
para (int i = 0; i <100000; i ++)
{
Usuário do usuário = novo usuário ();
user.setId (i);
user.setName ("nome" + i);
if (! constans.userlist.containskey (i))
{
Constans.UserList.put (i, usuário);
Constans.Uservec.add (usuário);
}
}
System.out.println ("End End ------------------------------------------- -------------------------------------------------------- -------------------------
}
}
Quando vamos
A cópia do código é a seguinte:
// sincronizado (constans.userlist)
// {
list.putall (constans.userlist);
//}
Quando a sincronização não é usada, uma exceção é lançada de volta. É porque constans.userlist não é sincronizado, em vez do método Putall não é seguro.
A diferença entre o vetor e a hashtable é que o método Addall do vetor pode ser executado normalmente sem sincronização.
User.java
A cópia do código é a seguinte:
usuário de classe pública
{
private int id;
nome de string privado;
public int getId ()
{
ID de retorno;
}
public void SetId (int id)
{
this.id = id;
}
public string getName ()
{
Nome de retorno;
}
public void SetName (nome da string)
{
this.name = nome;
}
}
Não estou escrevendo bem, todo mundo me perdoa.