머리말
고려하지 않고 동시 컨테이너 클래스는 일반적으로 ArrayList를, 같은 스레드 안전 클래스,보다 효율적으로의 HashMap을 사용하여 멀티 스레드. 동시성 시나리오에서 자주 사용 ConcurrentHashMap의 이러한 스레드 안전 등 ArrayBlockingQueue를 용기, 일부 효율성을 희생하지만, 그러나 그것은 안전했다.
스레드 안전 용기는 위에서 언급 한 java.util.concurrent의 패키지에,이 패키지 동시 용기를 많이는 오늘 모든 그것으로 어설프게로 밝혀졌다.
다음 후속 각각에 대한 심층 탐사를 간략를 수행합니다.
동시 용기 소개
-
ConcurrentHashMap의 : 동시 버전의 HashMap
-
으로 CopyOnWriteArrayList : ArrayList를 동시 버전
-
CopyOnWriteArraySet : 동시 설정
-
ConcurrentLinkedQueue를 : 동시 큐 (목록 기준)
-
ConcurrentLinkedDeque : 동시 큐 (양방향 연결리스트 기준)
-
ConcurrentSkipListMap과 : 동시지도 기반의 점프 테이블
-
ConcurrentSkipListSet : 설정 기반의 동시 점프 테이블
-
ArrayBlockingQueue 등 : 블로킹 큐 (어레이 기반)
-
LinkedBlockingQueue 등 : 블로킹 큐 (목록 기준)
-
LinkedBlockingDeque를 : 블로킹 큐 (양방향 연결리스트 기준)
-
인 PriorityBlockingQueue : 보안 스레드 우선 순위 큐
-
SynchronousQueue는 : 큐 쌍을 읽어
-
LinkedTransferQueue : 데이터 교환 대기열 목록을 기반으로
-
의 DelayQueue : 대기 시간 대기열
1.ConcurrentHashMap 동시 버전의 HashMap
가장 일반적인 동시 용기 중 하나는 동시 시나리오에서 캐시로서 사용될 수있다. 바닥은 여전히 해시 테이블이지만, JAVA 8 및 자바 7 JAVA (8) 더 많은 자료를 사용하고 있으며, 두 버전에 적지 않은 변화 종종 같은 (일부 비교 구현을 할 것입니다 인터뷰).
비교적 큰 차이 (해시리스트에 심각한 충돌의 퇴화를 방지하기 CAS (낙관적 잠금)을 사용하여 버려진 로크 세그먼트 경쟁 JAVA (8)의 잠금을 줄이며 위해서하는 보조 잠금 장치, JAVA 7 변환이 위치에서 충돌 목록을 생성 한 후, 오브젝트가 서로 동일한 해시 값 체인)이고, 사슬 길이의 레드 - 블랙 트리에 임계 값 (8)에 도달 (목록에 비해 트리 쿼리 효율)을보다 안정적이다.
2.CopyOnWriteArrayList 동시 버전의 ArrayList
ArrayList를 동시 버전은 기본 구조 배열이며, 그 차이는 ArrayList를 그이다 소자 새로운 배열을 작성 추가 시간을 삭제하는 경우, 추가 또는 새로운 배열에서 특정 오브젝트를 제외하고, 마지막 배열 새로운 배열 원래 대체 .
적용 현장 : 읽기 작업을하지 그러므로 덜 적합 읽고 장면을 작성하기위한 잠금, 쓰기 (추가, 삭제, 변경) 작업 잠금을 수행한다.
제한 시간 : 잠금을 판독하지 않으므로 (고효율의 ArrayList와 같은 일반 읽기), 전류 사본 판독은 판독 더티 데이터 일 수있다. 마음 경우,하지 않는 것이 좋습니다.
소스 감정 봐 :
3.CopyOnWriteArraySet 동시 설정
기반으로 CopyOnWriteArrayList의 바닥이 배열 인 말을하는 것입니다 실현 (으로 CopyOnWriteArrayList는 멤버 변수를 포함)를 각각 추가 삽입 할 필요 (잠금)이 있는지 여부를 알기 위해 전체 컬렉션을 통과해야 함을 의미합니다 존재하지 않습니다.
해당 장면 : 플러스 적용으로 CopyOnWriteArrayList 장면에서 너무 크지 컬렉션 (부상이 감당할 수있는 모든 트래버스).
4.ConcurrentLinkedQueue 동시 큐 (목록 기준)
동시 큐를 달성하는리스트에 기초하여, 스레드 안전을 위해 잠금 중 (CAS)를 사용한다. 데이터 구조가 목록이기 때문에, 그래서 이론적으로 데이터가 성공할 추가하는 것입니다 더 큐 크기 제한이 없습니다.
5.ConcurrentLinkedDeque 동시 큐 (양방향 연결 목록에 기초한)
그 호출 스택의 후 전진 될 것을 물론 후 전진 (FILO) 밖에있을 수 있고, 동시 양방향 링크리스트 큐 헤드를 달성 꼬리 때문에 FIFO합니다 (FIFO) 이외에 별도로 작동 될 수있다.
6.ConcurrentSkipListMap 점프 테이블을 기반 동시성지도
SkipList는 점프 테이블은 공간 데이터 구조 시간 중복 데이터 층에 의해리스트 인덱스 층 유사한 효과 이진 검색을 달성하는 점프 테이블, 즉
동시 설정에 따라 7.ConcurrentSkipListSet 점프 테이블
HashSet에와 ConcurrentSkipListMap과이다의 HashMap, ConcurrentSkipListSet의 관계와 마찬가지로, 그는 정교하지 않을 것입니다.
8.ArrayBlockingQueue 블록 큐 (어레이 기반)
큐는 배열로 구현 될 수 차단을 바탕으로, 배열 위치까지 차단됩니다 가득 차면 구조가 일을 입력 할 때, 개발 처해야한다 배열 크기는 잠금 ReentrantLock와 보증 스레드 안전에 의해, (또한 직접 반환 및 대기 시간 초과를 지원합니다).
언뜻 보면 약간은 공기가 제 시간에 여기 스레드를 읽을 경우 차단되지 않았을 것 같은 잠금은 읽기, 쓰기, 혼란?
는 NotEmpty의 응답 거짓말, notFull 년, 잠금이 유사한 동기화 + 대기를했다 그래서 잠금에서이 두 작은 것들은 + 기능을 알립니다. 포털 → 마지막으로 절전 / 대기를 알 수 / 통지 /의 notifyAll
9.LinkedBlockingQueue은 (리스트에 기초하여) 큐 블록
의 최대 값이 기본 INT가 설정되어 있지 않은 경우는, 더욱 용량 제한되면, 차단리스트 큐 구현에 기초하여, 그리고 같은 ConcurrentLinkedQueue를 차단하지. 비율
10.LinkedBlockingDeque 차단 큐 (양방향 연결 목록에 기초한)
마찬가지로 LinkedBlockingQueue 등,하지만 독특한 작업의 이중 연결리스트를 제공합니다.
11.PriorityBlockingQueue 우선 순위 큐 스레드 안전
당신은 비교기를 구성 할 때 가방 요소가 분류 한 후 시간 읽기 순서를 보낼 예정대로 볼 수 있습니다 전달할 수 있습니다. 높은 우선 순위 요소가 되었기 때문에, 장기적인 소비하지 않을 수 있습니다 어떤 우선 순위가 낮은 요소에서 온다.
12.SynchronousQueue 악수 데이터 큐
이 요소를 저장하기 위해 실제 공간이 없었기 때문에 거짓 큐는 각 삽입 작업은 해당 제거 작업을하지 않을 때 넣어 계속 할 수 있어야합니다.
可以看到,写入的线程没有任何sleep,可以说是全力往队列放东西,而读取的线程又很不积极,读一个又sleep一会。输出的结果却是读写操作成对出现。
JAVA中一个使用场景就是Executors.newCachedThreadPool(),创建一个缓存线程池。
13.LinkedTransferQueue 基于链表的数据交换队列
实现了接口TransferQueue,通过transfer方法放入元素时,如果发现有线程在阻塞在取元素,会直接把这个元素给等待线程。如果没有人等着消费,那么会把这个元素放到队列尾部,并且此方法阻塞直到有人读取这个元素。和SynchronousQueue有点像,但比它更强大。
14.DelayQueue 延时队列
可以使放入队列的元素在指定的延时后才被消费者取出,元素需要实现Delayed接口。
总结
上面简单介绍了JAVA并发包下的一些容器类,知道有这些东西,遇到合适的场景时就能想起有个现成的东西可以用了。想要知其所以然,后续还得再深入探索一番。
感谢你看完我的长篇大论,如果你觉得本次分享对你有帮助的话,可以帮我点个赞。有不足的地方,也欢迎在下方评论指出。
或者也可以关注我的公众号【Java技术zhai】,不定期的技术干货内容分享,带你重新定义架构的魅力!