Wie wir alle wissen, sind Vektor und Hashtable in Java Thread-Safe. Daher wird es keine Probleme beim Betrieb von Vektor und Hashtable geben. Aber es gibt eine Situation: Beim Kopieren eines Hashtabels auf einen anderen Hashtable, wenn die Blume der Putall -Methode verwendet wird, wird ein Java.util.ConcurrentModificationException geworfen. Laden Sie zuerst den Code hoch:
Testsync.java
Die Codekopie lautet wie folgt:
öffentliche Klasse Testsync
{
/**
* Main (ich verwende einen Satz, um die Funktion dieser Methode zu beschreiben)
* (Die anwendbaren Bedingungen für diese Methode werden hier beschrieben)
* @param args
* @return void
* @Ausnahme
* @Since 1.0.0
*/
öffentliche statische Leere Main (String [] Args)
{
Karte <Integer, Benutzer> list = new Hashtable <Integer, Benutzer> ();
LIST <Bener> vec = new vector <wechsels> ();
Testthread thread = new TestThread ();
Thread.Start ();
int i = 0;
während (i <1000)
{
i ++;
System.out.println ("iiiiiiiiiii = -------------------" + i);
list.clear ();
vec.clear ();
// Vektor und Hashtable sind Thread-Safe, und die Implementierung der beiden Sätze in der Putall-Methode ist unterschiedlich
vec.addall (constans.uservec);
// synchronisiert (constans.userlist)
// {
list.putall (constans.userList);
//}
System.out.println ("----------" + list.size ());
System.out.println ("----------" + vec.size ());
}
System.out.println ("Over -------------------------------------------------- --- ");
}
}
Klasse Constans
{
public static map <Integer, Benutzer> userList = new Hashtable <Integer, Benutzer> ();
public static list <Benutzer> uservec = new vector <user> ();
}
Klasse testthread erweitert Thread
{
@Override
öffentliche void run ()
{
für (int i = 0; i <100000; i ++)
{
User user = new user ();
user.setId (i);
user.setName ("name" + i);
if (! constans.userlist.containesKey (i))
{
Constans.UserList.put (i, Benutzer);
Constans.uservec.add (Benutzer);
}
}
System.out.println ("Thread End ------------------------------------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -----------------------
}
}
Wenn wir werden
Die Codekopie lautet wie folgt:
// synchronisiert (constans.userlist)
// {
list.putall (constans.userList);
//}
Wenn keine Synchronisation verwendet wird, wird eine Ausnahme zurückgeworfen. Es liegt daran, dass Constans.UserList nicht synchronisiert ist, anstatt die Putall -Methode nicht sicher zu sein.
Der Unterschied zwischen Vektor und Hashtable besteht darin, dass die Addall -Methode des Vektors normal ohne Synchronisation ausgeführt wird.
User.java
Die Codekopie lautet wie folgt:
Benutzer der öffentlichen Klasse
{
private int id;
privater Zeichenfolge Name;
public int getid ()
{
Rückgabe -ID;
}
öffentliche void setid (int id)
{
this.id = id;
}
öffentliche Zeichenfolge GetName ()
{
Rückgabename;
}
public void setName (String -Name)
{
this.name = name;
}
}
Ich schreibe nicht gut, jeder vergeben mir.