우리 모두 알다시피, 벡터와 해시 가능은 Java의 스레드 안전입니다. 따라서 벡터 및 해시 가능의 작동에는 아무런 문제가 없습니다. 그러나 상황이 있습니다 : 해시 가능을 다른 해시 가능에 복사 할 때, putall 방법의 꽃이 사용되면 java.util.concurrentModificationException이 발생합니다. 먼저 코드 업로드 :
testsync.java
코드 사본은 다음과 같습니다.
공개 클래스 테스트 동기
{
/**
* 메인 (이 방법의 기능을 설명하기 위해 하나의 문장을 사용합니다)
* (이 방법에 대한 해당 조건은 여기에 설명되어 있습니다)
* @param args
* @return void
* @예외
* @Since 1.0.0
*/
public static void main (String [] args)
{
Map <integer, user> list = new Hashtable <integer, user> ();
List <user> vec = new Vector <user> ();
testthread 스레드 = new TestThread ();
thread.start ();
int i = 0;
while (i <1000)
{
i ++;
System.out.println ( "iiiiiiiiiiiii = ----------------------" + i);
list.clear ();
vec.clear ();
// 벡터와 해시 가능
vec.addall (constans.uservec);
// synchronized (constans.userList)
// {
list.putall (constans.userlist);
//}
System.out.println ( "---------" + list.size ());
System.out.println ( "---------" + vec.size ());
}
System.out.println ( "Over ---------------------------------------- --- ");
}
}
Class Constans
{
public static map <integer, user> userlist = new Hashtable <integer, user> ();
공개 정적 목록 <user> uservec = new vector <user> ();
}
클래스 testthread는 스레드를 확장합니다
{
@보수
공개 void run ()
{
for (int i = 0; i <100000; i ++)
{
사용자 user = 새 사용자 ();
user.setid (i);
user.setName ( "이름" + i);
if (! constans.userlist.containskey (i))
{
constans.userlist.put (i, user);
constans.uservec.add (사용자);
}
}
System.out.println ( "스레드 엔드 ---------------------------------------- --------------------------------------------------------- -------------------------
}
}
우리가 할 때
코드 사본은 다음과 같습니다.
// synchronized (constans.userList)
// {
list.putall (constans.userlist);
//}
동기화를 사용하지 않으면 예외가 뒤로 패배됩니다. Constans.userlist는 PutAll 방법이 안전하지 않고 동기화되지 않기 때문입니다.
벡터와 해시 테이블의 차이점은 벡터의 addall이 동기화없이 정상적으로 실행될 수 있다는 것입니다.
user.java
코드 사본은 다음과 같습니다.
공개 수업 사용자
{
개인 int ID;
개인 문자열 이름;
public int getid ()
{
반환 ID;
}
공개 void setid (int id)
{
this.id = id;
}
공개 문자열 getName ()
{
반환 이름;
}
public void setName (문자열 이름)
{
this.name = 이름;
}
}
나는 잘 쓰지 않고 모두를 용서합니다.