평신도의 언어 (14) 자바 동시 컨테이너에서

머리말

고려하지 않고 동시 컨테이너 클래스는 일반적으로 ArrayList를, 같은 스레드 안전 클래스,보다 효율적으로의 HashMap을 사용하여 멀티 스레드. 동시성 시나리오에서 자주 사용 ConcurrentHashMap의 이러한 스레드 안전 등 ArrayBlockingQueue를 용기, 일부 효율성을 희생하지만, 그러나 그것은 안전했다.

스레드 안전 용기는 위에서 언급 한 java.util.concurrent의 패키지에,이 패키지 동시 용기를 많이는 오늘 모든 그것으로 어설프게로 밝혀졌다.

다음 후속 각각에 대한 심층 탐사를 간략를 수행합니다.

 

동시 용기 소개

  1. ConcurrentHashMap의 : 동시 버전의 HashMap

  2. 으로 CopyOnWriteArrayList : ArrayList를 동시 버전

  3. CopyOnWriteArraySet : 동시 설정

  4. ConcurrentLinkedQueue를 : 동시 큐 (목록 기준)

  5. ConcurrentLinkedDeque : 동시 큐 (양방향 연결리스트 기준)

  6. ConcurrentSkipListMap과 : 동시지도 기반의 점프 테이블

  7. ConcurrentSkipListSet : 설정 기반의 동시 점프 테이블

  8. ArrayBlockingQueue 등 : 블로킹 큐 (어레이 기반)

  9. LinkedBlockingQueue 등 : 블로킹 큐 (목록 기준)

  10. LinkedBlockingDeque를 : 블로킹 큐 (양방향 연결리스트 기준)

  11. 인 PriorityBlockingQueue : 보안 스레드 우선 순위 큐

  12. SynchronousQueue는 : 큐 쌍을 읽어

  13. LinkedTransferQueue : 데이터 교환 대기열 목록을 기반으로

  14. 의 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】,不定期的技术干货内容分享,带你重新定义架构的魅力!

추천

출처www.cnblogs.com/lfs2640666960/p/11884568.html