Java에서 ArrayList에 대한 액세스 동기화
앞서 Vector와 ArrayList의 차이점에 대해 이야기할 때 동기화 원리를 설명했습니다. ArrayList는 동기화되지 않으며 동기화 없이 다중 스레드 환경에서 사용해서는 안 됩니다.동기화하는 방법에는 두 가지가 있습니다.
- Collections.synchronizedList()
- 의 보호된 버전을 사용하십시오. 어레이 목록: CopyOnWriteArrayList
1) ArrayList를 Collections.synchronizedList()와 동기화합니다
여기서 주목해야 할 중요한 점은 반복자가 아래 예제와 같이 동기화된 블록 내부에 있어야 한다는 것입니다.
import java.util.ArrayList입니다.Runtime:
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());
}
}
}
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