Java에서 ArrayList에 대한 액세스 동기화

앞서 Vector와 ArrayList의 차이점에 대해 이야기할 때 동기화 원리를 설명했습니다. ArrayList는 동기화되지 않으며 동기화 없이 다중 스레드 환경에서 사용해서는 안 됩니다.

동기화하는 방법에는 두 가지가 있습니다.
  1. Collections.synchronizedList()
  2. 의 보호된 버전을 사용하십시오. 어레이 목록:  CopyOnWriteArrayList

1) ArrayList를 Collections.synchronizedList()와 동기화합니다

여기서 주목해야 할 중요한 점은 반복자가 아래 예제와 같이 동기화된 블록 내부에 있어야 한다는 것입니다.

import java.util.ArrayList입니다. 
import java.util.Collections;
import java.util.Iterator;
import java.util.List;

public class ArrayListSynchronized{

public static void main(String[] args) {

// ArrayList를 만듭니다< 문자열> synchronized
목록< 문자열> slist = Collections.synchronizedList (새로운 ArrayList< 문자열> ());

//ArrayList에 항목 추가
slist.add("1");
slist.add("5");
slist.add("2");
slist.add("7");

System.out.println("동기화된 목록 찾아보기:");
synchronized(slist) {
반복자< 문자열> 반복자 = slist.iterator();
while (iterator.hasNext())
System.out.println(iterator.next());
}
}
}
Runtime:

browse synchronized list:
1
5
2
7

2) CopyOnWriteArrayList

import java.util.Iterator; 

public class CopyOnWriteArrayList{

public static void main(String[] args) {

java.util.concurrent.CopyOnWriteArrayList< 문자열> al =
새로운 java.util.concurrent.CopyOnWriteArrayList< 문자열> ();

//ArrayList에 항목 추가
al.add("notebook");
al.add("키트");
al.add("USB 스틱");
al.add("계산기");

System.out.println("동기화된 목록 찾아보기:");
반복자< 문자열> 반복자 = al.iterator();
while (iterator.hasNext())
System.out.println(iterator.next());
}
}
실행:

동기화된 목록 찾아보기:
notebook
kit
USB 스틱
calculator

Commentaires (12)

JD
Jean Dupont Il y a 2 heures

Excellent tutoriel !

👍 12 Répondre Signaler
CodeurJava ✓ Auteur • Il y a 1 heure

N'hésitez pas si vous avez des questions.