Как мы все знаем, Vector и Hashtable безопасны в Java. Следовательно, не будет никаких проблем в работе вектора и хэштета. Но существует ситуация: при копировании хэштета в другую хэштату, если используется цветок метода Путолла, java.util.concurrentModificationException будет брошен. Первый загрузите код:
Testsync.java
Кода -копия выглядит следующим образом:
Общественный класс TestSync
{
/**
* Main (я использую одно предложение для описания функции этого метода)
* (Применимые условия для этого метода описаны здесь)
* @param args
* @return void
* @исключение
* @Since 1.0.0
*/
Public Static Void Main (String [] args)
{
Map <Integer, user> list = new Hashtable <Integer, user> ();
Список <user> vec = new Vector <user> ();
TestThread Thread = New TestThread ();
thread.start ();
int i = 0;
пока (я <1000)
{
i ++;
System.out.println ("iiiiiiiiiiii = -------------------" + i);
list.clear ();
vec.clear ();
// Vector и Hashtable безопасны для потока, а реализация двух наборов в методе Путолла отличается
vec.addall (constans.uservec);
// синхронизированный (constans.userlist)
// {
list.putall (constans.userlist);
//}
System.out.println ("---------" + list.size ());
System.out.println ("---------" + vec.size ());
}
System.out.println ("Over ----------------------------------------------- --- ");
}
}
Класс Констанс
{
Public Static Map <Integer, пользователь> userList = new Hashtable <Integer, user> ();
Общедоступный статический список <user> uservec = new Vector <user> ();
}
Class TestThread Extends Thread
{
@Override
public void run ()
{
для (int i = 0; i <100000; i ++)
{
Пользователь пользователь = новый пользователь ();
user.setid (i);
user.setname ("name" + i);
if (! constans.userlist.containskey (i))
{
Constans.userlist.put (i, user);
Constans.uservec.add (пользователь);
}
}
System.out.println ("Конец потока --------------------------------------------- ------------------------------------------------------ -----------------------
}
}
Когда мы будем
Кода -копия выглядит следующим образом:
// синхронизированный (constans.userlist)
// {
list.putall (constans.userlist);
//}
Когда синхронизация не используется, исключение отброшено. Это потому, что Constans.UserList не синхронизирован, а не путолский метод небезопасен.
Разница между вектором и хэштетом состоит в том, что метод Vector's Addall может работать нормально без синхронизации.
User.java
Кода -копия выглядит следующим образом:
Пользователь открытого класса
{
частный INT ID;
Приватное название строки;
public int getid ()
{
вернуть идентификатор;
}
public void setId (INT ID)
{
this.id = id;
}
public String getName ()
{
вернуть имя;
}
public void setName (String name)
{
this.name = name;
}
}
Я не пишу хорошо, все прощают меня.