자바 다 중 스 레 드 프로 그래 밍 학습 노트 의 7: 다 중 스 레 드 환경 에서 집합 API 를 안전하게 사용 합 니 다 (코드 포함)
집합 API 에서 최초 로 설 계 된 Vector 와 Hashtable 은 다 중 스 레 드 가 안전 합 니 다.예 를 들 어 Vector 에 있어 요 소 를 추가 하고 삭제 하 는 방법 은 동기 화 됩 니 다.하나의 스 레 드 만 Vector 의 인 스 턴 스 와 상호작용 을 한다 면 대상 자 물 쇠 를 가 져 오고 방출 하 라 고 요구 하 는 것 은 낭비 입 니 다. 또한 불필요 할 때 동기 화 를 남용 하면 잠 금 을 가 져 올 수도 있 습 니 다.따라서 집합 내용 을 바 꾸 는 방법 에 대해 서 는 동기 화 된 것 이 하나 도 없다.집합 은 본질 적 으로 다 중 스 레 드 가 안전 하지 않 기 때문에 여러 스 레 드 와 집합 이 상호작용 을 할 때 다 중 스 레 드 가 안전 하도록 하기 위해 반드시 추가 적 인 조 치 를 취해 야 한다.
Collections 클래스 에는 여러 개의 정적 방법 이 있 습 니 다. 동기 화 방법 을 통 해 동기 화 집합 이 아 닌 집합 을 봉인 할 수 있 습 니 다.
public static Collection synchronizedCollention(Collection c)
public static List synchronizedList(list l)
public static Map synchronizedMap(Map m)
public static Set synchronizedSet(Set s)
public static SortedMap synchronizedSortedMap(SortedMap sm)
public static SortedSet synchronizedSortedSet(SortedSet ss)
이 방법 들 은 기본적으로 동기 집합 방법 버 전의 새로운 종 류 를 되 돌려 준다.예 를 들 어 다 중 스 레 드 가 안전 하고 Array List 가 지원 하 는 List 를 만 들 기 위해 다음 코드 를 사용 할 수 있 습 니 다.
List list = Collection.synchronizedList(new ArrayList());
ArrayList 인 스 턴 스 를 즉시 패키지 합 니 다. 동기 화 되 지 않 은 ArrayList 에 대한 직접 참조 (즉, 익명 인 스 턴 스 를 직접 패키지 하 는 것) 가 존재 하지 않 습 니 다.이것 은 가장 안전 한 방법 이다.다른 스 레 드 가 ArrayList 인 스 턴 스 를 직접 참조 하려 면 비동기 수정 을 실행 할 수 있 습 니 다.
다음은 다 중 스 레 드 에서 집합 요 소 를 안전하게 옮 겨 다 니 는 예제 입 니 다.저 희 는 Iterator 를 사용 하여 List 의 요 소 를 하나씩 스 캔 합 니 다. 다 중 스 레 드 환경 에서 현재 집합 에 있 는 요 소 를 옮 겨 다 닐 때 다른 스 레 드 가 요 소 를 추가 하거나 삭제 하 는 것 을 막 고 싶 습 니 다.안전하게 옮 겨 다 니 는 실현 방법 은 다음 과 같다.
import java.util.*;
public class SafeCollectionIteration extends Object {
public static void main(String[] args) {
// , ,
// , List
List wordList = Collections.synchronizedList(new ArrayList());
//wordList add , wordList
wordList.add("Iterators");
wordList.add("require");
wordList.add("special");
wordList.add("handling");
// wordList ,
// , add remove
synchronized ( wordList ) {
Iterator iter = wordList.iterator();
while ( iter.hasNext() ) {
String s = (String) iter.next();
System.out.println("found string: " + s + ", length=" + s.length());
}
}
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.