자바 다 중 스 레 드 프로 그래 밍 학습 노트 의 7: 다 중 스 레 드 환경 에서 집합 API 를 안전하게 사용 합 니 다 (코드 포함)

2314 단어
전재 출처 를 밝 혀 주 십시오:http://blog.csdn.net/ns_code/article/details/17200509
집합 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());
			}
		}
	}
}

좋은 웹페이지 즐겨찾기