집합 류 동기 화 성능 분석
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Vector;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
import com.sun.org.apache.xalan.internal.xsltc.runtime.Hashtable;
public class CollectionDemo {
public static void main(String[] args){
testConcurrentList();
testConcurrentMap();
}
public static void testConcurrentList(){
long start = System.currentTimeMillis();
long list_time = 0;
List list = new ArrayList();
for(int i = 0; i < 1000000; i++){
list.add(i);
}
for(int i = 0; i < list.size(); i++){
int k = (Integer) list.get(i);
}
list_time = System.currentTimeMillis() - start;
start = System.currentTimeMillis();
long vector_time = 0;
Vector vec = new Vector();
// public synchronized void insertElementAt
for(int i = 0; i < 1000000; i++){
vec.add(i);
}
for(int i = 0; i < vec.size(); i++){
int k = (Integer) vec.get(i);
}
vector_time = System.currentTimeMillis() - start;
start = System.currentTimeMillis();
long concurrentList_time = 0;
List concurrentList = Collections.synchronizedList(new ArrayList());
// synchronized(mutex)
for(int i = 0; i < 1000000; i++){
concurrentList.add(i);
}
for(int i = 0; i < concurrentList.size(); i++){
int k = (Integer) concurrentList.get(i);
}
concurrentList_time = System.currentTimeMillis() - start;
start = System.currentTimeMillis();
long copyOnWriteArrayList_time = 0;
CopyOnWriteArrayList copyOnWriteArrayList = new CopyOnWriteArrayList();
// (ReentrantLock) 。
for(int i = 0; i < 1000000; i++){
concurrentList.add(i);
}
for(int i = 0; i < copyOnWriteArrayList.size(); i++){
int k = (Integer) copyOnWriteArrayList.get(i);
}
copyOnWriteArrayList_time = System.currentTimeMillis() - start;
System.out.println("list--------------- vector--------------
Collections.synchronizedList(new ArrayList()) --------CopyOnWriteArrayList");
System.out.println(list_time + "------------" + vector_time + "------------"
+ concurrentList_time + "------------" + copyOnWriteArrayList_time);
}
public static void testConcurrentMap(){
long start = System.currentTimeMillis();
long map_time = 0;
Map map = new HashMap();
for(int i = 0; i < 1000000; i++){
map.put("item" + i,"value" + i);
}
for(int i = 0; i < map.size(); i++){
Object value = map.get("item" + i);
}
map_time = System.currentTimeMillis() - start;
start = System.currentTimeMillis();
long ht_time = 0;
Hashtable ht = new Hashtable();
for(int i = 0; i < 1000000; i++){
ht.put("item" + i,"value" + i);
}
for(int i = 0; i < ht.size(); i++){
Object value = ht.get("item" + i);
}
ht_time = System.currentTimeMillis() - start;
start = System.currentTimeMillis();
long concurrentMap_time = 0;
Map concurrentMap = Collections.synchronizedMap(new HashMap());
for(int i = 0; i < 1000000; i++){
concurrentMap.put("item" + i,"value" + i);
}
for(int i = 0; i < concurrentMap.size(); i++){
Object value = concurrentMap.get("item" + i);
}
concurrentMap_time = System.currentTimeMillis() - start;
start = System.currentTimeMillis();
long copyOnWriteArrayMap_time = 0;
ConcurrentHashMap concurrentHashMap = new ConcurrentHashMap();
for(int i = 0; i < 1000000; i++){
concurrentHashMap.put("item" + i,"value" + i);
}
for(int i = 0; i < concurrentHashMap.size(); i++){
Object value = concurrentHashMap.get("item" + i);
}
copyOnWriteArrayMap_time = System.currentTimeMillis() - start;
System.out.println("map--------------- hashTable--------------
Collections.synchronizedMap(new HashMap()); --------ConcurrentHashMap");
System.out.println(map_time + "------------" + ht_time
+ "------------" + concurrentMap_time + "------------"
+ copyOnWriteArrayMap_time);
}
}
출력:
데이터 양 List vector Collections. synchronizedList CopyOnWriteArrayList 1000000 62 125 172 47 50000000 485 953 1031 625 10000000 1078 1812 2329 2343
List 동기 화가 필요 하 다 면 CopyOnWriteArrayList 를 사용 하 는 것 을 권장 합 니 다.동기 화가 필요 하지 않 으 면 list 를 사용 하면 되 고 동기 화 를 사용 하지 않 아 도 됩 니 다. 동기 화 는 많은 성능 을 소모 하기 때 문 입 니 다.
데 이 터 량 HashMap Hashtable Collections. synchronizedMap CopyOnWriteArrayMap 1000000 1375 1094 1469 1547 50000000 6860 6281 7688 8172 100000 78 125 78 94
Hashtable 은 Dictionary 의 하위 클래스 이 고 HashMap 은 Map 인터페이스의 실현 클래스 입 니 다.데이터 양 이 많 을 때 hashtable 의 성능 이 좋 지만 hashmap 의 기능 이 더욱 강하 고 새로운 프레임 워 크 에 서 는 hashmap 를 사용 하 는 것 을 권장 합 니 다. hashtable 을 사용 하지 마 십시오.
동기 화 된 list 가 없 으 면 동기 화 된 세 가지 방식 으로 이 루어 진 list 성능 분석: 1. 오래된 Vector / Hashtable 류 로 위의 두 가지 문 제 는 걱정 하지 않 아 도 됩 니 다.Vector / Hashtable 이 제공 하 는 모든 방법 은 synchronized 입 니 다.교체 과정 에서 데이터 구조 가 수정 되면 교체 기 는 최신 수정 을 반영 할 수 있 고 이상 을 버 리 지 않 는 다.그러나 이런 방법 은 효율 이 낮 아 사용 을 권장 하지 않 는 다.2. ArrayList / HashMap 과 동기 화 포장 기 를 사용 하면 동기 화 포장 기 를 사용 하여 용 기 를 스 레 드 로 안전하게 만 들 수 있 습 니 다. 어떤 방법 은 synchronized Java 코드 1. List synchArray List = Collections. synchronized List (new ArrayList) 를 사용 합 니 다.2. Map synchHashMap = Collections. synchronizedMap (new HashMap () 3. java 5.0 으로 새로 가입 한 Concurrent LinkedQueue, Concurrent HashMap, CopyOnWriteArray List 와 CopyOnWriteArray Set 로 이 집합 을 병행 수정 하 는 것 이 안전 합 니 다.재 접속 잠 금 (ReentrantLock) 은 재 귀적 으로 막 히 지 않 는 동기 화 메커니즘 으로 이 루어 진다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
자바 파일 압축 및 압축 풀기파일 의 간단 한 압축 과 압축 해 제 를 실현 하 였 다.주요 테스트 용 에는 급 하 게 쓸 수 있 는 부분 이 있 으 니 불편 한 점 이 있 으 면 아낌없이 가르쳐 주 십시오. 1. 중국어 문 제 를 해 결 했 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.