[읽기 노트] 실용적인 자바 높은 동시성 프로그래밍 (제 2 판) 읽기 노트


여기에 사진 설명 삽입

1. 개요

이 책을 읽은 후 미터의 구현 논리를 살펴보십시오.

1.1. 평행 세계로 들어가기

병렬성과 무어의 법칙은 잊어 버리세요
동시성과 병렬성의 차이는 좋습니다.
다중 스레드 교착 상태,
라이브 록 amdahl의 법칙
32 비트 긴 데이터 읽기는 원자 적이 지 않습니다.
명령 재배치 및 사전 발생 원칙.

1.2 자바 병렬 프로그램의 기초

주로 쓰레드 관련 콘텐츠를 설명하고 몇 가지 중요한 키워드를 살펴볼 수 있습니다.

1.3 jdk 동시 패키지

이 장은 더 얕은 것에서 더 깊은 것으로 진행되며, 설명은 매우 훌륭하고 점차 심층적이며 초보자와 두 번째 시청에 매우 적합합니다.

동기 제어

  1. 동기화 된 키워드 사용 설명
  2. 재진입 잠금을위한 좋은 파트너, 조건은 객체의 대기와 매우 유사합니다.
  3. 중요 섹션에 대한 동시 입력 수에 대한 제한과 동일한 세마포어를 설명했습니다.
  4. 읽기-쓰기 잠금과 성능 테스트의 분리 아이디어 설명
  5. 카운트 다운 카운터, 로켓 발사 프로그램
  6. 순환 울타리 육군 팀 조립 사례
  7. 현장 차단 도구 잠금 사용 지원
  8. 구아바의 현재 제한 RateLimiter

스레드 풀 설명

  1. 스레드 풀이 란?
  2. jdk의 기존 스레드 풀 소개 및 단점
  3. 스레드 풀은 내부적으로 ThreadLocalPool을 구현합니다.
  4. 거부 전략 및 맞춤 거부 전략 소개
  5. 스레드 풀을 확장하기 전에 메소드 실행 후 AOP
  6. 스레드 풀 크기 설정 공식
  7. 현장 스택 정보를 인쇄하기위한 사용자 지정 스레드 풀 (매우 중요)
  8. fork join 框架 ForkJoinPool
  9. 구아바의 스레드 풀 확장

jdk 동시 컨테이너

  1. 해시 맵 목록 currentHashMap CopyOnWriteArrayLisy
  2. BlockingQueue
  3. 데이터 순서를위한 점프 테이블 (유용)

JMH 성능 테스트

  1. 도구 소개 및 사용

1.4 잠금 최적화 및 예방 조치

몇 가지 조언

  1. 잠금 유지 시간 감소
  2. 잠금 세분화 줄이기 currentHashMap 세그먼트 잠금
  3. 단독 잠금 대신 별도의 읽기-쓰기 잠금 사용
  4. Lock 분리, ArrayBlockingQueue take () 메서드는 헤드에서 데이터를 가져 오는 것이고 put () 메서드는 테일에서 데이터를 넣는 것입니다.이 두 가지는 서로 간섭하지 않으며 하나의 잠금을 사용해서는 안됩니다.
  5. 잠금 거칠기는 for 루프 외부의 for 루프에서 잠금을 해제합니다.

잠금 최적화에 대한 Java 가상 머신의 노력

  1. 부분 잠금, 잠금을 획득하는 첫 번째 스레드, 다음 요청은 여전히 ​​잠금을 획득하는 것, 동기화 없음, 잠금 경쟁이 치열할 때 효과가 좋지 않습니다.
  2. 경량 잠금은 객체 헤드를 포인터로 사용하여 잠금을 보유한 스레드 스택을 가리키고 스레드가 객체 잠금을 보유하는지 여부를 결정합니다. 잠금이 실패하면 무거운 잠금으로 확장됩니다.
  3. 가상 머신의 마지막 작업 인 스핀 잠금, 스레드가 자체적으로 잠금을 획득하는 경우 여러주기 동안 빈 루프
  4. 잠금 제거, 이스케이프 분석을 기반으로 가상 머신이 의도적으로 또는 의도하지 않게 도입 된 잠금, 안전한 경우 잠금이 제거됩니다.

threadLocal 소개

  1. threadLocalMap은 스레드가 종료 될 때 정리됩니다. 메모리 누수를 방지하기 위해 적극적으로 null을 설정하는 것이 좋습니다.

자물쇠 없음

  1. cas 루프, 충돌이 감지되면 충돌이 없을 때까지 현재 작업을 다시 시도합니다.
  2. 잠금 경쟁으로 인한 잠금없는 시스템 오버 헤드가 없으며 스레드 간의 일반적인 스케줄링으로 인한 오버 헤드가 없습니다.
  3. 대부분의 최신 프로세서는 원자 CAS 명령어를 지원합니다.
  4. 잠금이없는 AtomicInteger
  5. Java의 포인터 Unsafe 클래스에 대한 간략한 소개이지만 자세한 설명은 없습니다.
  6. 잠금이없는 참조 개체 인 AtomicReference는 일반 해당 참조에 대해 개체 참조를 수정할 때 스레드 안전성에 ABA 문제가 있음을 보장 할 수 있습니다.
  7. 타임 스탬프 AtomicStampedReference가있는 개체 참조는 수정 프로세스 중에 개체가 상태를 잃는 문제를 해결합니다.
  8. 배열은 잠금이 없을 수도 있습니다. AtomicIntegerArray
  9. 일반 변수도 원자 연산을 즐길 수 있도록합니다 AtomicIntegerFieldUpdater 이것은 좋은 방법이지만 일반적으로 사용되지는 않으므로 자세히 살펴 보지 않았습니다.
  10. 스레드는 서로를 돕고 동기 용량은 0이며 동기에 대한 모든 쓰기는 동기에 대한 읽기 작업을 기다려야합니다. 후속 작업에서는 관련 소스 코드에 대해 설명하고 더 심도있게 살펴볼 수 있습니다.

교착 상태에 대한 질문

  1. 깊이없는 철학자의 식사 문제

1.5 병렬 모드 및 알고리즘

싱글 톤 모드

불변 모드

  1. 자바 문자열 유형

생산자 소비자 모델

잠금없는 캐시 프레임 워크 파괴자

  1. 사건을 면밀히 살펴 보지 않았습니다

잘못된 공유 문제를 해결하기위한 CPU 캐시 최적화

  1. long의 묶음은 데이터 블록 인 64 바이트를 차지합니다.

기능 모드

  1. 사용자 지정 기능 모드

다음은 정렬 알고리즘입니다.

네트워크 NIO
nio 관련 사례, 볼 것이 많지 않음, 코드가 너무 많음

1.6 Java 8 9 10 및 동시성

일류 시민으로서의 기능

함수형 프로그래밍의 기초

  1. FunctionalInterface 주석
  2. 람다 식

향상된 미래 : CompletableFuture

  1. CompletableFuture는 Futureje 인터페이스와 CompletionStage 인터페이스 (40 개 이상의 메소드)를 구현합니다.
  2. 지원 시간 초과

향상된 읽기-쓰기 잠금 StampedLock

  1. 읽기-쓰기 잠금은 읽기 조화의 기능을 분리하지만 읽기 잠금은 쓰기 잠금을 완전히 차단합니다.
  2. StampedLock의 내부 구현은 CLH 잠금을 기반으로하며, CLH 잠금은 스핀 잠금으로, 기아가 발생하지 않고 FIFO 서비스 주문이 보장 될 수 있습니다.
  3. 기본 개념 : 잠금은 대기중인 스레드의 대기열을 유지합니다. 잠금을 적용했지만 성공하지 못한 모든 스레드가이 대기열에 기록됩니다. 각 노드 (노드는 스레드를 나타냄)는 현재 상태를 확인하기 위해 표시를 (잠김)으로 저장합니다. 스레드가 해제되었습니다 잠금을 해제합니다.
  4. 이 시점에서 원리 설명에 대해 자세히 살펴 보지 않았습니다.

원자 강화

  1. 더 빠른 원자 클래스 LongAdder
  2. currentHashMap, map.compyteIfAbsent 향상

모델 게시 및 구독

  1. Java 9 리 액티브 프로그래밍은 소셜 프로그래밍이 비동기 스트림에서 데이터를 처리하는 데 사용된다는 것을 반영합니다. 애플리케이션이 데이터 항목을 수신 할 때마다이를 처리합니다. 리 액티브 프로그래밍은 스트림 형태로 데이터를 처리하므로 메모리 하이에서 사용하는 것이 더 효율적입니다. . jdk9를 간단하게보기 때문에 이해하지 못했습니다. jdk8이 오랫동안 계속 될 것이기 때문입니다.

1.7 akka를 사용하여 동시성 프로그램 구축

netty를 배웠기 때문에 akka가 무엇을 할 수 있는지, netty가 무엇을 할 수 있는지, netty가 무엇을 할 수 있는지,하지만 akka는 그것을 할 수 없습니다. 그래서 저는 이것을 사용할 기회가 없었기 때문에이 장을 직접 건너 뛰었습니다. 단지 netty에만 집중했습니다. .

1.8 병렬 프로그램 디버깅

이 장에서는 좋은 점이 없으며, IDEA와는 무관 한 이클립스의 디버깅을 주로 설명하며, 이클립스는 건너 뛰기 때문에 오랫동안 필요하지 않습니다. 나는 여전히 디버깅에 대해 조금 알고 있습니다.

그리고이 장에는 많은 내용이 있습니다. 보는 것도 나쁘지 않습니다. 그냥 대략적으로 살펴 보았습니다.

1.9 Jetty 핵심 코드 분석

안 봤기 때문에 안 봤어

추천

출처blog.csdn.net/qq_21383435/article/details/114693378