마인드 맵 갤러리 Java 동시성 시스템 지식 맵(동시 프로그래밍) 마인드 맵
블로킹 큐, 동시성 기본 사항, 잠금, JAVA 메모리 모델 및 기타 지식 측면을 포함하는 Java 동시성 시스템 지식 맵(동시 프로그래밍)에 대한 마인드 맵입니다.
2023-11-06 19:35:07에 편집됨이것은 (III) 저산소증-유도 인자 프롤릴 하이드 록 실라 제 억제제에 대한 마인드 맵이며, 주요 함량은 다음을 포함한다 : 저산소증-유도 인자 프롤릴 하이드 록 실라 제 억제제 (HIF-PHI)는 신장 빈혈의 치료를위한 새로운 소형 분자 경구 약물이다. 1. HIF-PHI 복용량 선택 및 조정. Rosalasstat의 초기 용량, 2. HIF-PHI 사용 중 모니터링, 3. 부작용 및 예방 조치.
이것은 Kuka Industrial Robots의 개발 및 Kuka Industrial Robot의 모션 제어 지침에 대한 마인드 맵입니다. 주요 내용에는 쿠카 산업 로봇의 역사, 쿠카 산업 로봇의 특성, 쿠카 산업 로봇의 응용 분야, 2. 포장 프로세스에서 쿠카 로봇은 빠르고 일관된 포장 작업을 달성하고 포장 효율성을 높이며 인건비를 줄입니다. 2. 인건비 감소 : 자동화는 운영자에 대한 의존성을 줄입니다. 3. 조립 품질 향상 : 정확한 제어는 인간 오류를 줄입니다.
408 컴퓨터 네트워크가 너무 어렵습니까? 두려워하지 마세요! 나는 피를 구토하고 지식 맥락을 명확히하는 데 도움이되는 매우 실용적인 마인드 맵을 분류했습니다. 컨텐츠는 매우 완전합니다. 네트워크 아키텍처에서 응용 프로그램 계층, TCP/IP 프로토콜, 서브넷 디비전 및 기타 핵심 포인트에 이르기까지 원칙을 철저히 이해하는 데 도움이 될 수 있습니다. 📈 명확한 논리 : Mindmas 보물, 당신은 드문 기회가 있습니다. 서둘러! 이 마인드 맵을 사용하여 408 컴퓨터 네트워크의 학습 경로에서 바람과 파도를 타고 성공적으로 해변을 얻으십시오! 도움이 필요한 친구들과 공유해야합니다!
이것은 (III) 저산소증-유도 인자 프롤릴 하이드 록 실라 제 억제제에 대한 마인드 맵이며, 주요 함량은 다음을 포함한다 : 저산소증-유도 인자 프롤릴 하이드 록 실라 제 억제제 (HIF-PHI)는 신장 빈혈의 치료를위한 새로운 소형 분자 경구 약물이다. 1. HIF-PHI 복용량 선택 및 조정. Rosalasstat의 초기 용량, 2. HIF-PHI 사용 중 모니터링, 3. 부작용 및 예방 조치.
이것은 Kuka Industrial Robots의 개발 및 Kuka Industrial Robot의 모션 제어 지침에 대한 마인드 맵입니다. 주요 내용에는 쿠카 산업 로봇의 역사, 쿠카 산업 로봇의 특성, 쿠카 산업 로봇의 응용 분야, 2. 포장 프로세스에서 쿠카 로봇은 빠르고 일관된 포장 작업을 달성하고 포장 효율성을 높이며 인건비를 줄입니다. 2. 인건비 감소 : 자동화는 운영자에 대한 의존성을 줄입니다. 3. 조립 품질 향상 : 정확한 제어는 인간 오류를 줄입니다.
408 컴퓨터 네트워크가 너무 어렵습니까? 두려워하지 마세요! 나는 피를 구토하고 지식 맥락을 명확히하는 데 도움이되는 매우 실용적인 마인드 맵을 분류했습니다. 컨텐츠는 매우 완전합니다. 네트워크 아키텍처에서 응용 프로그램 계층, TCP/IP 프로토콜, 서브넷 디비전 및 기타 핵심 포인트에 이르기까지 원칙을 철저히 이해하는 데 도움이 될 수 있습니다. 📈 명확한 논리 : Mindmas 보물, 당신은 드문 기회가 있습니다. 서둘러! 이 마인드 맵을 사용하여 408 컴퓨터 네트워크의 학습 경로에서 바람과 파도를 타고 성공적으로 해변을 얻으십시오! 도움이 필요한 친구들과 공유해야합니다!
동시 프로그래밍
JMM(Java 메모리 모델)
스레드 통신 메커니즘
메모리 공유
자바 채택
메시징
메모리 모델
재 주문
프로그램의 성능을 위해 프로세서와 컴파일러는 프로그램의 순서를 변경합니다.
상태
단일 스레드 환경에서는 프로그램 실행 결과를 변경할 수 없습니다.
데이터 종속성이 있는 경우 재정렬이 허용되지 않습니다.
질문
다중 스레드 환경에서 순서를 바꾸면 데이터가 안전하지 않을 수 있습니다.
순차적 일관성
멀티스레드 환경의 이론적 참조 모델
프로그램에 대한 강력한 메모리 가시성을 보장합니다.
특성
스레드의 모든 작업은 프로그램 순서대로 수행되어야 합니다.
모든 스레드는 프로그램의 동기화 여부에 관계없이 단일 작업 실행 순서만 볼 수 있습니다.
각 작업은 원자적으로 수행되어야 하며 모든 스레드에 즉시 표시되어야 합니다.
전에 일어난 일
JMM의 핵심 이론은 메모리 가시성을 보장합니다.
JMM에서 한 작업의 결과를 다른 작업에서 볼 수 있어야 하는 경우 두 작업 간에 사전 발생 관계가 있어야 합니다.
이론
한 작업이 다른 작업보다 먼저 발생하는 경우 첫 번째 작업의 실행 결과는 두 번째 작업에 표시되고 첫 번째 작업의 실행 순서는 두 번째 작업 이전이 됩니다.
두 작업 사이에 사전 발생 관계가 존재한다고 해서 해당 작업이 사전 발생 원칙에 지정된 순서대로 실행되어야 한다는 의미는 아닙니다. 재정렬 후의 실행 결과가 이전 발생 관계에 따른 실행 결과와 일치하면 이러한 재정렬은 불법이 아닙니다.
마치 직렬인 것처럼
최적화를 위해 모든 작업을 재정렬할 수 있지만 재정렬 결과가 변경될 수 없도록 해야 합니다.
동기화됨
동기화, 헤비웨이트 잠금
원칙
동기화는 메서드나 코드 블록이 실행될 때 동시에 하나의 메서드만 임계 섹션에 들어갈 수 있도록 보장하며, 공유 변수의 메모리 가시성을 보장할 수도 있습니다.
객체 잠금
일반적인 동기화 방법, 잠금은 현재 인스턴스 개체입니다.
정적 동기화 방법, 잠금은 현재 클래스의 클래스 객체입니다.
동기화된 메소드 블록, 잠금은 괄호 안의 객체입니다.
구현 메커니즘
자바 객체 헤더
동기화된 잠금은 Java 객체 헤더에 저장됩니다.
데이터의 두 부분을 포함합니다.
마크 워드(마크 필드)
마크워드는 아주 작은 공간에 최대한 많은 데이터를 저장하기 위해 고정되지 않은 데이터 구조로 설계되었으며, 객체의 상태에 따라 자체 저장 공간을 재사용하게 됩니다.
포함하다
해시 코드(HashCode), GC 생성 기간, 잠금 상태 플래그, 스레드가 보유한 잠금, 편향된 스레드 ID, 편향된 타임스탬프
클래스 포인터(타입 포인터)
감시 장치
소유자
처음에 NULL은 현재 모니터 레코드를 소유한 스레드가 없음을 의미합니다. 스레드가 잠금을 성공적으로 소유하면 잠금이 해제될 때 스레드의 고유 식별자가 NULL로 설정됩니다.
잠금 최적화
스핀 잠금
스레드는 일정 시간 동안 대기하며 잠금을 보유한 스레드가 곧 잠금을 해제할지 확인하기 위해 즉시 일시 중단되지 않습니다(순환 방법).
스핀 워드 수를 제어하기 어렵습니다. (-XX:preBlockSpin)
실존 이론: 스레드는 자주 일시 중지되고 큰 부담을 안고 깨어납니다. 각 스레드는 짧은 시간 동안 잠금을 유지하며 스레드가 일시 중지된 후 깨어난 후에 이득이 더 크다고 생각할 수 있습니다.
결점
회전 수를 결정할 수 없습니다
적응형 스핀 잠금
회전 횟수는 더 이상 고정되지 않습니다. 이는 동일한 잠금의 이전 회전 시간과 잠금 소유자의 상태에 따라 결정됩니다.
스핀이 성공하면 스핀 수를 늘릴 수 있습니다. 잠금 획득에 자주 실패하면 스핀 수가 줄어듭니다.
잠금 제거
데이터 경쟁이 없으면 JVM은 잠금 메커니즘을 제거합니다.
판단 기반
변수 이스케이프
잠금 거칠기
여러 개의 연속적인 잠금 및 잠금 해제 작업을 함께 연결하여 더 큰 잠금으로 확장합니다. 예를 들어 for 루프 내에서 잠금을 획득합니다.
경량 자물쇠
다중 스레드 경쟁 없이 운영 체제 뮤텍스를 사용하여 기존의 중량급 잠금으로 인한 성능 소비를 줄입니다.
CAS를 통해 잠금 획득 및 해제
성과기준
대부분의 자물쇠의 경우 전체 수명 주기 동안 경쟁이 없습니다.
결점
멀티 스레드 환경에서는 무거운 잠금 장치보다 작동 효율성이 느립니다.
바이어스 잠금
멀티 스레드 경쟁 없이 불필요한 경량 잠금 실행 경로를 최소화하기 위해
주로 불필요한 CAS 작업을 피하세요. 경쟁 잠금 장치가 실패할 경우 경량 잠금 장치로 업그레이드하세요.
휘발성 물질
특성
휘발성 가시성: 휘발성을 읽을 때 항상 이 변수에 대한 최종 쓰기를 볼 수 있습니다.
휘발성 원자성: 휘발성은 i와 같은 복합 연산을 제외하고 단일 읽기/쓰기(32비트 Long, Double)에 대해 원자성입니다.
구현 메커니즘
메모리 장벽
메모리 의미론
휘발성 변수를 쓸 때 JMM은 스레드에 해당하는 로컬 메모리의 공유 변수 값을 메인 메모리에 즉시 새로 고칩니다.
휘발성 변수를 읽을 때 JMM은 스레드에 해당하는 로컬 메모리를 유효하지 않은 것으로 설정하고 주 메모리에서 직접 공유 변수를 읽습니다.
운영 체제 의미론
메인 메모리, 캐시(스레드 프라이빗) 캐시 일관성?
해결책
버스에 LOCK#을 추가하여
캐시 일관성 프로토콜(MESI 프로토콜)을 통해
메모리 모델
재 주문
전에 일어난 일
DCL
싱글톤 패턴
DCL
재 주문
이전에 일어난 일
해결책
휘발성 용액
재정렬 비활성화
클래스 초기화 기반 솔루션
클래스로더 메커니즘을 사용하여 인스턴스를 초기화할 때 스레드가 하나만 있는지 확인하십시오. JVM은 클래스 초기화 단계 중에 잠금을 획득합니다. 이 잠금은 여러 스레드에 의해 동일한 클래스의 초기화를 동기화할 수 있습니다.
동시성 기본 사항
AQS
AbstractQueuedSynchronizer, 동기화 장치는 JUC의 핵심 기본 구성 요소를 구현합니다.
동기화 상태 및 FIFO 동기화 대기열 획득과 같은 하위 클래스의 동기화 장치 구현과 관련된 많은 세부 문제를 해결했습니다.
템플릿 메서드 패턴을 사용하여 AQS는 다수의 공통 메서드를 구현하고 하위 클래스는 상속을 통해 추상 메서드를 구현하여 동기화 상태를 관리합니다.
CLH 동기화 큐
FIFO 양방향 대기열, AQS는 동기화 상태 관리 문제를 해결하기 위해 이를 사용합니다.
첫 번째 노드는 깨어나서 CLH 동기화 대기열의 끝에 대기열이 추가될 때까지 기다립니다.
동기식 상태 획득 및 해제
독점적인
잠금 받기
동기화 상태 가져오기: 획득
AcquireInterruptically: 중단 없이 획득
시간 초과 획득: tryAcquireNanos
잠금 해제
풀어 주다
공유됨
잠금 받기
획득공유
잠금 해제
릴리스공유
스레드 차단 및 깨우기
스레드가 잠금을 획득하면 다른 스레드가 다시 잠금을 획득할 때 차단해야 합니다. 스레드가 잠금을 해제하면 AQS가 스레드를 깨울 책임이 있습니다.
잠금 지원
잠금 및 기타 동기화 클래스를 생성하는 데 사용되는 기본 스레드 차단 기본 요소입니까?
LockSupport를 사용하는 각 스레드는 권한과 연결되어 있으며 프로세스에서 사용할 수 있는 권한이 있으면 park()를 호출하면 즉시 반환됩니다. 그렇지 않으면 차단될 수 있습니다. 라이센스를 아직 사용할 수 없는 경우 unpark를 호출하여 라이센스를 사용할 수 있도록 할 수 있습니다.
공원(), 공원 해제()
카스
JUC 시스템 전체의 핵심이자 가장 기본이 되는 이론인 비교와 교환(Compare And Swap)
메모리 값 V, 이전 예상 값 A, 업데이트할 값 B. 메모리 값 V의 값이 이전 예상 값 A와 같은 경우에만 메모리 값 V의 값이 B로 수정되고, 그렇지 않으면 아무것도 변경되지 않습니다. 완료됩니다.
네이티브에는 4개의 매개변수가 있습니다.
결함
사이클 시간이 너무 길다
하나의 공유 변수만 원자적으로 작동하도록 보장할 수 있습니다.
ABA 문제
해결책
버전 번호
AtomicStamped참조
잠그다
재진입 잠금
재진입 잠금은 재귀적 비차단 동기화 메커니즘입니다.
동기화보다 더 강력하고 유연한 잠금 메커니즘으로 교착 상태 가능성을 줄일 수 있습니다.
공정한 잠금과 불공정한 잠금으로 구분됩니다.
하단 레이어는 AQS를 사용하여 구현되며 내부 동기화를 통해 AQS를 상속합니다.
재진입 읽기쓰기 잠금
읽기-쓰기 잠금, 두 개의 잠금: 공유 잠금: 읽기 잠금, 배타적 잠금: 쓰기 잠금
공정성, 불공평성, 재진입 및 잠금 성능 저하 지원
잠금 다운그레이드: 쓰기 잠금 획득, 읽기 잠금 획득, 쓰기 잠금 해제 순서에 따라 쓰기 잠금이 읽기 잠금으로 다운그레이드될 수 있습니다.
상태
Lock은 스레드 대기 및 깨우기 작업에 대해 보다 상세하고 유연한 조건을 제공합니다.
조건 큐는 내부적으로 유지됩니다. 현재 스레드가 wait() 메서드를 호출하면 현재 스레드에서 노드(Node)가 생성되고 해당 노드가 대기열 끝에 추가됩니다.
동시성 도구
순환 장벽
공통 장벽 지점에 도달할 때까지 스레드 그룹이 서로를 기다릴 수 있습니다.
평신도의 관점에서 말하면 스레드 그룹이 장벽에 도달하면 차단되도록 하십시오. 마지막 스레드가 장벽에 도달할 때까지 장벽은 열리지 않으며 장벽에 의해 차단된 모든 스레드는 계속 작동합니다.
하단 레이어는 ReentrantLock Condition을 사용하여 구현됩니다.
애플리케이션 시나리오
멀티 스레드 결과를 병합하는 작업은 여러 스레드에서 데이터를 계산하고 최종적으로 계산 결과를 병합하는 데 사용됩니다.
카운트다운래치
이를 통해 하나 이상의 스레드가 다른 스레드에서 수행 중인 일련의 작업이 완료될 때까지 기다릴 수 있습니다.
주어진 개수로 CountDownLatch를 초기화합니다. countDown() 메서드가 호출되기 때문에 현재 개수가 0에 도달할 때까지 wait 메서드가 차단됩니다. 그 후에는 대기 중인 모든 스레드가 해제되고 대기하는 모든 후속 호출이 즉시 반환됩니다. 이 동작은 한 번만 발생하며 카운트를 재설정할 수 없습니다. 카운트를 재설정해야 하는 경우 CyclicBarrier 사용을 고려하세요.
CyclicBarrier와의 차이점
CountDownLatch의 기능은 1개 또는 N개의 스레드가 다른 스레드가 실행을 완료할 때까지 기다리도록 허용하는 반면 CyclicBarrier는 N개의 스레드가 서로를 기다리도록 허용하는 것입니다.
CountDownLatch의 카운터는 재설정할 수 없으며 CyclicBarrier의 카운터는 재설정하여 사용할 수 있으므로 순환 장벽이라고 합니다.
공유 잠금을 사용하여 내부적으로 구현됨
신호기
신호
여러 공유 리소스에 대한 액세스를 제어하는 카운터
개념적으로 세마포어는 권한 집합을 유지합니다. 필요한 경우 각 acquire()는 권한을 사용할 수 있을 때까지 차단한 다음 권한을 획득합니다. 각 release()는 권한을 추가하여 잠재적으로 차단 getter를 해제합니다. 그러나 실제 라이센스 객체를 사용하는 대신 Semaphore는 사용 가능한 라이센스 수를 계산하고 그에 따라 조치를 취합니다.
세마포어 세마포어는 음수가 아닌 정수(>=1)입니다. 스레드가 공유 리소스에 액세스하려면 먼저 세마포어 > 0인 경우 리소스를 얻고 세마포어를 1로 설정해야 합니다. Semaphore 값이 0이면 모든 공유 리소스가 다른 스레드에 의해 점유되었으며 해당 스레드는 다른 스레드가 리소스를 해제할 때까지 기다려야 함을 의미합니다. 스레드가 리소스를 해제하면 세마포어는 1입니다.
애플리케이션 시나리오
특정 리소스(물리적 또는 논리적)에 액세스할 수 있는 스레드 수를 제한하는 데 종종 사용됩니다.
공유 잠금을 사용하여 내부적으로 구현됨
교환기
한 쌍의 요소를 쌍으로 연결하고 교환할 수 있는 스레드의 동기화 지점
동시 작업 간에 데이터를 교환할 수 있습니다. 특히 Exchanger 클래스를 사용하면 두 스레드 간에 동기화 지점을 정의할 수 있습니다. 두 스레드가 동기화 지점에 도달하면 데이터 구조를 교환하므로 첫 번째 스레드의 데이터 구조가 두 번째 스레드로 이동하고 두 번째 스레드의 데이터 구조가 첫 번째 스레드로 이동합니다.
다른
스레드로컬
멀티 스레드 환경의 멤버 변수 문제에 대한 솔루션이지만 스레드 동기화와는 아무런 관련이 없습니다. 아이디어는 각 스레드에 대해 별도의 변수 복사본을 생성하여 각 스레드가 다른 스레드의 해당 복사본에 영향을 주지 않고 자체 변수 복사본을 독립적으로 변경할 수 있도록 하는 것입니다.
ThreadLocal은 공유 변수 문제를 해결하는 데 사용되지 않으며 스레드 동기화를 조정하기 위해 존재하지도 않지만 각 스레드가 자체 상태를 처리할 수 있도록 하기 위해 도입된 메커니즘입니다.
네 가지 방법
get(): 이 스레드 지역 변수의 현재 스레드 복사본에 있는 값을 반환합니다.
initialValue(): 이 스레드 지역 변수에 대한 현재 스레드의 "초기 값"을 반환합니다.
제거(): 현재 스레드에서 이 스레드 지역 변수의 값을 제거합니다.
set(T value): 이 스레드 지역 변수의 현재 스레드 복사본에 있는 값을 지정된 값으로 설정합니다.
스레드로컬맵
스레드 격리 메커니즘 구현의 핵심
각 Thread에는 내부에 ThreadLocal.ThreadLocalMap 유형의 멤버 변수가 있으며, 이는 실제 ThreadLocal 변수의 복사본을 저장하는 데 사용됩니다.
키-값 쌍을 사용하여 각 스레드의 변수 복사본을 저장하는 메서드를 제공합니다. 키는 현재 ThreadLocal 개체이고 값은 해당 스레드의 변수 복사본입니다.
조심하세요
ThreadLocal 인스턴스 자체는 값을 저장하지 않으며 단지 현재 스레드에서 값의 복사본을 찾기 위한 키를 제공할 뿐입니다.
ThreadLocal에 포함된 Thread가 아니라 Thread에 포함된 ThreadLocal입니다.
메모리 누수 문제
스레드로컬맵
키는 약한 참조 값은 강한 참조이므로 재활용할 수 없습니다.
명시적으로 제거()를 호출하세요.
포크/조인
작업을 병렬로 실행하기 위한 프레임워크는 큰 작업을 여러 개의 작은 작업으로 나누고 최종적으로 각 작은 작업의 결과를 집계하여 큰 작업의 결과를 얻는 프레임워크입니다.
주요 아이디어
"분할"
포크는 작업을 분해하고 조인은 데이터를 수집합니다.
직업 절도
스레드는 실행을 위해 다른 큐에서 작업을 훔칩니다.
블록을 실행하는 스레드는 느린 스레드의 작업 실행을 돕고 전체 작업의 효율성을 향상시킵니다.
대기열은 양방향 대기열을 사용해야 합니다.
핵심 수업
포크조인풀
작업 실행을 위한 스레드 풀
ForkJoinTask
ForkJoinPool에 대한 작업, 작업 추상화를 나타냅니다.
포크조인작업자스레드
작업을 수행하는 작업자 스레드
Java 동시 컬렉션
동시해시맵
동시 업데이트의 안전성을 보장하기 위해 CAS 동기화, 하단 레이어는 배열 연결 목록/레드-블랙 트리 저장 구조를 사용합니다.
중요한 내부 클래스
마디
키-값 키-값 쌍
트리노드
레드-블랙 트리 노드
트리빈
이는 레드-블랙 트리(red-black tree)를 구성하는 과정과 동일합니다.
전달노드
ConcurrentHashMap 확장 작업에 사용되는 보조 노드
sizeCtl
테이블 초기화 및 확장 작업을 제어하는 데 사용되는 제어 식별자
의미
음수는 초기화 또는 확장 작업이 진행 중임을 나타냅니다.
-1은 초기화를 의미합니다.
-N은 확장 작업을 수행 중인 N-1 스레드가 있음을 나타냅니다.
양수 또는 0은 해시 테이블이 초기화되지 않았음을 나타냅니다. 이 값은 초기화 또는 다음 확장의 크기를 나타냅니다.
중요한 작업
초기화테이블
ConcurrentHashMap 초기화 방법
하나의 스레드만 초기화 프로세스에 참여할 수 있으며 다른 스레드는 일시 중지해야 합니다.
생성자는 초기화 프로세스를 수행하지 않습니다. 초기화는 실제로 put 작업에 의해 트리거됩니다.
단계
sizeCtl < 0은 초기화가 진행 중이고 스레드가 일시 중단되었음을 의미합니다.
스레드는 초기화 프로세스를 수행하기 위해 초기화 자격(CAS(SIZECTL, sc, -1))을 획득합니다.
초기화 단계가 완료된 후 sizeCtl = 0.75 * n(다음 확장 임계값)을 설정하여 다음 확장의 크기를 나타냅니다.
놓다
주요 아이디어
해시 값을 기준으로 테이블에 삽입된 노드의 위치를 계산합니다. 위치가 비어 있으면 직접 삽입하고, 그렇지 않으면 연결 목록이나 트리에 삽입합니다.
실제 상황은 더 복잡하다
단계
테이블이 null이고 스레드가 초기화 단계에 들어갑니다. 다른 스레드가 초기화 중이면 스레드가 정지됩니다.
현재 삽입된 i 위치가 null이면 이 위치가 처음으로 삽입되었음을 의미하며, CAS를 사용하여 노드를 삽입하면 addCount가 호출되어 확장이 필요한지 확인됩니다. 삽입에 실패하면 계속 매칭(스핀)
노드의 해시 == MOVED(-1)이면 스레드가 확장되고 있음을 의미하며 확장 프로세스에 들어갑니다.
다른 경우에는 연결 리스트나 레드-블랙 트리 구조에 따라 노드를 삽입하지만 이 과정에는 잠금(동기화)이 필요합니다.
얻다
단계
테이블==null;null 반환
연결된 목록/레드-블랙 트리 노드에서 가져오기
확장
멀티스레드 확장
단계
크기가 원래 크기의 두 배인 nextTable을 생성합니다. 이 단계는 단일 스레드 환경에서 완료됩니다.
원본 테이블의 내용을 nextTable에 복사합니다. 이 단계에서는 다중 스레드 작업이 가능합니다.
연결리스트를 레드-블랙 트리로 변환하는 과정
연결리스트의 요소 수가 임계값 8에 도달하면 연결리스트가 레드-블랙 트리로 변환됩니다.
레드-블랙 트리 알고리즘
1.8과 1.7의 차이점
ConcurrentLinkedQueue
FIFO 원칙을 사용하여 요소를 정렬하고 CAS 알고리즘을 사용하여 내부적으로 구현된 링크 노드 기반의 무제한 스레드 안전 대기열
불변성
대기열의 마지막 요소 중 다음 요소가 null입니다.
대기열에서 삭제되지 않은 모든 노드의 항목은 null일 수 없으며 헤드 노드에서 탐색될 수 있습니다.
삭제할 노드의 경우 직접 null로 설정하는 대신 먼저 해당 항목 필드를 null로 설정합니다(반복자는 null 항목이 있는 노드를 건너뜁니다).
헤드 및 테일 업데이트가 지연되도록 허용합니다. 무슨 뜻이에요? 이는 머리와 꼬리가 항상 첫 번째 요소와 마지막 요소를 가리키는 것은 아니라는 의미입니다(나중에 설명됨).
머리의 불변성과 가변성
꼬리의 불변성과 가변성
미묘함: CAS는 대기열의 불일치를 허용하면서 데이터 작업을 완료하는 데 사용되며 약한 일관성이 완전히 입증됩니다.
ConcurrentSkipListMap
세 번째 키-값 데이터 구조: SkipList(건너뛰기 목록)
건너뛰기 목록
균형 잡힌 이진 트리 구조
스킵 리스트(Skip list)는 정렬된 데이터를 다층 연결 리스트에 분산시키는 것을 허용하며, "시간에 대한 공간 교환" 알고리즘을 사용하여 데이터가 위로 올라갈지 여부를 결정하기 위해 0-1의 난수를 사용합니다. 각 노드에 정방향 포인터를 추가하고, 삽입, 삭제, 검색 시 관여가 불가능한 일부 노드를 무시할 수 있어 효율성이 향상된다.
특성
여러 겹의 구조로 구성되어 있으며, 일정 확률을 통해 랜덤하게 레벨이 생성됩니다.
각 수준은 정렬된 연결 목록입니다. 기본값은 사용된 생성자에 따라 매핑을 생성할 때 제공된 비교기에 따라 정렬될 수도 있습니다.
가장 낮은 수준(수준 1) 연결 목록에는 모든 요소가 포함됩니다.
요소가 수준 i의 연결 목록에 나타나면 수준 i 아래의 연결 목록에도 나타납니다.
각 노드에는 두 개의 포인터가 포함되어 있는데, 하나는 동일한 연결 목록의 다음 요소를 가리키고 다른 하나는 한 수준 아래의 요소를 가리킵니다.
찾기, 삭제, 추가
동시 건너뛰기 목록 집합
ConcurrentSkipListMap을 사용하여 내부적으로 구현됨
원자
기본형 클래스
기본 유형을 원자적으로 업데이트하는 데 사용됩니다.
AtomicBoolean
원자 업데이트 부울 유형
원자정수
원자 업데이트 정수
AtomicLong
원자 업데이트가 길다
정렬
배열의 요소를 원자적으로 업데이트
원자정수배열
정수 배열 요소의 원자 업데이트
AtomicLongArray
긴 정수 배열의 요소에 대한 원자적 업데이트
원자 참조 배열
참조 유형 배열 요소의 원자 업데이트
참조 유형
여러 변수를 원자적으로 업데이트하려면 이 원자 업데이트 참조 유형에서 제공하는 클래스를 사용해야 합니다.
원자 참조
참조 유형의 원자 업데이트
AtomicReferenceFieldUpdater
참조 유형 필드의 원자적 업데이트
AtomicMarkable참조
플래그 비트를 사용한 참조 유형의 원자적 업데이트
필드 수업
특정 클래스의 특정 필드만 필요한 경우 필드 클래스의 원자 업데이트를 사용해야 합니다.
AtomicIntegerFieldUpdater
정수 필드를 원자적으로 업데이트하는 업데이터
AtomicLongFieldUpdater
긴 필드를 원자적으로 업데이트하는 업데이터
AtomicStamped참조
버전 번호를 사용한 참조 유형의 원자적 업데이트
차단 대기열
어레이블로킹큐
배열로 구현된 FIFO 경계 차단 큐
ArrayBlockingQueue는 제한되어 있으며 생성자 중에 크기가 확인됩니다. 확인 후에는 변경이 지원되지 않습니다.
멀티스레드 환경에서는 "공정성"이 보장되지 않습니다.
성취하다
재진입 잠금
상태
LinkedBlockingQueue
링크 기반, 무제한 FIFO 차단 대기열
우선순위차단큐
우선순위 지원이 포함된 무제한 차단 대기열
기본적으로 요소는 자연순으로 오름차순으로 정렬됩니다. 비교기를 지정하여 요소를 정렬할 수 있습니다.
바이너리 힙
분류
최대 힙
상위 노드의 키 값은 항상 하위 노드의 키 값보다 크거나 같습니다.
최소 힙
상위 노드의 키 값은 항상 하위 노드의 키 값보다 작거나 같습니다.
추가 작업은 지속적으로 "상승"하고, 삭제 작업은 지속적으로 "하강"합니다.
성취하다
재진입 잠금 조건
바이너리 힙
지연 대기열
지연된 요소 획득을 지원하는 무제한 차단 큐
애플리케이션
캐시: 캐시에 만료된 캐시 데이터를 지웁니다.
작업 시간 초과 처리
성취하다
재진입 잠금 조건
지연 시간에 따라 정렬된 우선순위 대기열: PriorityQueue
지연된 인터페이스
지정된 지연 시간 후에 실행되어야 하는 개체를 표시하는 데 사용됩니다.
이 인터페이스에서는 이를 구현하는 클래스 구현이 이 인터페이스의 getDelay 메소드와 일치하는 순서를 제공하는 CompareTo 메소드를 정의해야 합니다.
동기 대기열
용량이 없는 차단 대기열
애플리케이션
작업을 교환하기 위해 생산자의 스레드와 소비자의 스레드를 동기화하여 특정 정보, 이벤트 또는 작업을 전달합니다.
이해하기 어렵고 Exchanger 사용에 어려움이 있음
연결된 전송 대기열
연결리스트로 구성된 무한한 블로킹 큐
ConcurrentLinkedQueue, 동기식 큐(공정 모드), 제한되지 않은 LinkedBlockingQueues 등의 상위 집합과 동일합니다.
선제 모드
가능하다면 직접 가져가세요. 그렇지 않으면 획득하거나 타임아웃되거나 중단될 때까지 이 위치를 차지합니다.
LinkedBlockingDeque
연결리스트로 구성된 양방향 차단 큐
용량은 선택 사항입니다. 과도한 확장을 방지하기 위해 초기화 중에 용량을 설정할 수 있습니다. 설정하지 않은 경우 기본 용량은 Integer.MAX_VALUE입니다.
사용
"일자리 훔치기" 패턴
스레드 풀
혜택
자원 소비 감소
생성된 스레드를 재사용하여 스레드 생성 및 소멸 비용 절감
응답 속도 향상
작업이 도착하면 스레드가 생성될 때까지 기다리지 않고 즉시 작업을 실행할 수 있습니다.
스레드 관리성 향상
통합 할당, 조정 및 모니터링
집행자
집행자
정적 팩토리 클래스는 Executor, ExecutorService, ScheduledExecutorService, ThreadFactory, Callable 및 기타 클래스의 정적 팩토리 메소드를 제공합니다.
ThreadPoolExecutor
매개변수 의미
코어풀크기
스레드 풀의 코어 스레드 수
최대 풀 크기
스레드 풀에 허용되는 최대 스레드 수
keepAlive시간
스레드 유휴 시간
단위
keepAliveTime의 단위
작업 대기열
실행 대기 중인 작업을 보관하는 데 사용되는 차단 대기열
사용된 차단 대기열
어레이블로킹큐
LinkedBlockingQueue
동기 대기열
우선순위차단큐
스레드팩토리
스레드 생성을 설정하는 데 사용되는 팩토리
기본스레드팩토리
매니저
RejectedExecutionHandler, 스레드 풀 거부 전략
분류
AbortPolicy: 예외를 직접 발생시킵니다. 기본 정책입니다.
CallerRunsPolicy: 호출자가 위치한 스레드를 사용하여 작업을 실행합니다.
DiscardOldestPolicy: 차단 대기열의 맨 앞에 있는 작업을 버리고 현재 작업을 실행합니다.
DiscardPolicy: 작업을 직접 삭제합니다.
스레드 풀 분류
새로운FixedThreadPool
고정된 개수의 스레드가 있는 재사용 가능한 스레드 풀
분석하다
corePoolSize는 maximumPoolSize와 일치합니다.
"제한되지 않은" 대기열 사용 LinkedBlockingQueue
maximumPoolSize, keepAliveTime, 거부된 실행 핸들러 유효하지 않은
새로운캐시된ThreadPool
단일 작업자 스레드를 사용하는 실행자
분석하다
corePoolSize 및 maximumPoolSize는 1로 설정됩니다.
LinkedBlockingQueue를 작업자 대기열로 사용
새로운SingleThreadExecutor
필요에 따라 새로운 스레드를 생성하는 스레드 풀
분석하다
corePoolSize가 0으로 설정되었습니다.
maximumPoolSize가 Integer.MAX_VALUE로 설정되었습니다.
WorkerQueue로서의 동기식 대기열
기본 스레드가 maximumPool 프로세스 작업의 스레드보다 빠르게 작업을 제출하는 경우 CachedThreadPool은 계속해서 새 스레드를 생성하므로 CPU 및 메모리 리소스가 소모될 수 있습니다.
과제 제출
실행자.실행()
ExecutorService.submit()
작업 실행
구현 프로세스
스레드 풀 튜닝
두 가지 모델
스레드 풀 모니터링
ScheduledThreadPoolExecutor
ThreadPoolExecutor에서 상속됨
지정된 지연 후에 작업을 실행하거나 주기적으로 작업을 실행합니다.
DelayQueue는 이를 구현하기 위해 내부적으로 사용되며 예약된 작업은 DelayQueue에 저장됩니다. DelayQueue는 대기열의 ScheduledFutureTask를 정렬하는 PriorityQueue를 내부적으로 캡슐화합니다.
미래
비동기식 계산
미래
운영 제공
실행 작업 취소
작업이 완료되었는지 쿼리
작업 실행 결과 가져오기
미래태스크
Runnable로 실행되거나 Future로 사용되어 Callable의 반환 값을 얻을 수 있는 RunnableFuture 인터페이스를 구현합니다.
AQS를 기반으로 내부적으로 구현