자바 고 효율 병행

한 동안 다 중 스 레 드 에 관 한 지식 을 되 돌아 보지 않 았 습 니 다.비록 업무 중 에 다 중 스 레 드 의 내용 을 사용 하지만 모두 기초 에 치 우 쳤 습 니 다.오늘 은 다 중 스 레 드 와 관련 된 내용 을 다시 읽 고 주의해 야 할 것 이 있 습 니 다.이것들 은 일반적으로 면접 고주파 문제 오 이다.
동시 다발 의 내막 을 이해 하 는 것 은 고급 프로그래머 에 게 없어 서 는 안 될 과정 이다.
자바 메모리 모델
자바 메모리 모델(JMM)과 JVM 이 실 행 될 때 데이터 영역 은 같은 개념 이 아니 라 자바 대상 모델 이 다음 에 따로 꺼 내 서 말 할 수 있다 는 개념 도 있 습 니 다.
JMM 은 모두 원자 성,가시 성,질서 성 을 중심 으로 한다
  • JMM 은 JVM 이 컴퓨터 의 메모리 와 어떻게 상호작용 하 는 지 정의 했다
  • 스 레 드 가 변수 에 대한 모든 작업 은 작업 메모리 에서 이 루어 져 야 합 니 다.메 인 메모 리 를 직접 조작 할 수 없습니다.
    메모리 간 상호작용:Lock,Unlock 주 메모리 Read,Write 주 메모리 Load,Store 작업 메모리 의 변수 Use,Assign 작업 메모리 의 변수
    JMM 에 대한 더 많은 정보 보기,다 중 스 레 드 자바 메모리 모델
    Volatile
    Volatile 은 자바 가상 컴퓨터 에서 제공 하 는 가장 경량급 동기 화 메커니즘 이 라 고 할 수 있 는데 이것 은 가시 성과 질서 성 만 보장 하고 원자 성 을 보장 하지 않 는 다.
    가시 성:한 라인 이 이 변수의 값 을 수정 하면 새로운 값 은 다른 라인 에 있어 서 바로 알 수 있 고,다른 두 라인 은 가시 성 을 실현 할 수 있 는 키워드:Synchronizedfinal질서 성:만약 에 본 스 레 드 에서 관찰 하면 모든 조작 이 질서 가 있 습 니 다.만약 에 한 스 레 드 에서 다른 스 레 드 를 관찰 하면 모든 조작 이 무질서 합 니 다.
    자바 와 스 레 드
    병발 은 PHP 에서 흔히 볼 수 있 는 다 중 프로 세 스 병발 과 같은 다 중 스 레 드 에 의존 하지 않 습 니 다.자바 의 Thread 류 의 모든 관건 적 인 방법 은 Native 로 성명 되 어 있 기 때문에 자바 는 스스로 스 레 드 를 실현 하지 않 았 습 니 다.
    스 레 드 를 실현 하 는 세 가지 방식:커 널 스 레 드 를 사용 하여 실현 하고 사용자 스 레 드 를 사용 하여 더욱 경량급 프로 세 스 를 실현 합 니 다.
  • 커 널 스 레 드 실현(KLT,Kernel-Level Thread).프로그램 은 일반적으로 커 널 스 레 드 를 직접 사용 하지 않 고 커 널 스 레 드 의 고급 인터페이스,경량급 프로 세 스(LWP,Light Weight Process,LWP)를 사용 합 니 다.먼저 커 널 스 레 드 가 있어 야 경량급 프로 세 스 가 있 습 니 다

  • 단점:각종 스 레 드 작업,예 를 들 어 생 성,분석,동기 화 는 시스템 호출 을 해 야 하고 시스템 호출 의 대가 가 비교적 높 으 므 로 사용자 상태 와 커 널 상태 에서 왔다갔다 전환 해 야 합 니 다.커 널 자원 을 소모 하면 시스템 이 경량급 프로 세 스 를 지원 하 는 수량 이 제한 되 어 있 습 니 다.
    4.567917.사용자 스 레 드 가 실현 되 고 넓 은 의미 에서 볼 때 하나의 스 레 드 가 커 널 스 레 드 가 아니라면 임 무 는 사용자 스 레 드 입 니 다.사용자 스 레 드 는 완전히 사용자 상태 에서 이 루어 집 니 다.커 널 의 도움 없 이 더 큰 스 레 드 수 를 지원 할 수 있 습 니 다
    단점:내부 핵 지원 이 없어 각종 조작 이 복잡 하 다.이 제 는 거의 버 렸 다.
    4.567917.사용자 스 레 드+경량급 프로 세 스 는 두 가지 점 을 종합 하면 사용자 프로 세 스 와 경량급 프로 세 스 의 수량 비례 가 정 해 지지 않 습 니 다
    스 레 드 스케줄 링
    협동 식 스케줄 링:장점 은 간단 한 것 을 실현 하 는 것 이다.전환 작업 은 라인 자체 에 대해 알 수 있 고 라인 동기 화 문제 가 없다.라인 은 자신의 일 을 끝 낸 후에 야 라인 전환 을 한다.
    단점:프로그램 작성 이 불안정 하면 시스템 을 제어 할 수 없습니다.하나의 프로 세 스 가 CPU 실행 을 양보 하지 않 으 면 시스템 이 붕 괴 될 수 있 습 니 다.
    선점 식 스케줄 링(자바 기본 스케줄 링):모든 스 레 드 는 시스템 에서 실행 코드 를 분배 합 니 다.스 레 드 의 전환 은 스 레 드 에 의 해 결정 되 지 않 습 니 다.프로 세 스 에 문제 가 발생 하면 시스템 은 이 프로 세 스 를 죽 일 수 있 습 니 다.
    주의:스 레 드 의 우선 순위 가 높 을 수록 스 레 드 가 먼저 실행 되 는 것 이 아 닙 니 다.다만 우선 순위 가 높 은 스 레 드 가 선택 되 었 을 수 있 습 니 다.
    Java 스 레 드 상태 변환
    그림 을 한 장 붙 이 고 잘 기억 하 세 요.
    스 레 드 안전 실현 방법
    4.567917.서로 배척 하고 동기 화 하 며 잠 금,비관 적 인 방안 을 추가 하여 공유 데이터 가 같은 시간 에 하나의 스 레 드 만 방문 하도록 확보한다.서로 배척 하 는 것 은 원인 이 고,동기 화 는 과일 이다
    4.567917.비 차단 동기 화,CAS,낙관적 인 방안 은 먼저 조작 을 하고 다른 스 레 드 가 없 으 면 조작 이 성공 합 니 다.다른 스 레 드 도 공유 데 이 터 를 조작 하고 있다 면 다시 시도 합 니 다
    4.567917.동기 화 방안 이 없 으 면 보통 순수 코드 이 고 일부 특성 이 있 습 니 다.예 를 들 어 쌓 인 공공 시스템 자원 에 의존 하지 않 습 니 다자물쇠 최적화
    4.567917.자전 자물쇠 와 자가 적응 자전 만약 에 데 이 터 를 공유 하면 아주 짧 은 시간 만 지속 된다.이 시간 을 위해 끊 고 회복 하 는 스 레 드 는 가치 가 없다.이때 우 리 는 뒤에 자 물 쇠 를 요청 하 는 스 레 드 를 잠시 기다 리 게 하고 스 레 드 를 바 쁜 순환(자전)하 게 할 수 있다.이것 이 바로 자전 자물쇠 이다
    데이터 가 얼마나 잠 겨 있 는 지 공유 할 가치 가 없 기 때문에 맹목적 인 자전 은 성능 의 손실 을 초래 할 수 있 습 니 다.JDK 1.6 이후 시스템 은 자체 적 으로 적응 하 는 자전 을 도 입 했 고 한 번 의 공유 데이터 가 잠 겨 있 을 때 시스템 에 가입 하여 여러 번 자전 자 물 쇠 를 얻 었 습 니 다.시스템 은 스 레 드 가 자전 하 는 횟수 를 더 오래 허용 할 수 있 습 니 다.만약 여러 차례 자전 자 물 쇠 를 얻 지 못 했다 면 시스템 은 다음 에 자전 자 물 쇠 를 생략 할 것 이다.
    4.567917.자 물 쇠 는 공유 데이터 경쟁 이 존재 하지 않 는 자 물 쇠 를 없앤다
    4.567917.자물쇠 가 굵 어 지면 여러 조작 이 같은 대상 에 자 물 쇠 를 추가 하고 잦 은 자 물 쇠 를 추가 하 는 것 도 성능 에 영향 을 줄 수 있 으 므 로 시스템 은 자물쇠 의 동기 화 범 위 를 확대 한다.StringBuffer()와 같은 여러 append 작업..
    4.567917.편향 자 물 쇠 는 편향 자물쇠 로 이해 할 수 있 습 니 다.자 물 쇠 는 첫 번 째 로 스 레 드 를 얻 는 것 에 치 우 칩 니 다.만약 에 다음 실행 과정 에서 이 자 물 쇠 는 다른 스 레 드 에 의 해 가 져 오지 않 으 면 편향 자 물 쇠 를 가 진 스 레 드 는 동기 화 할 필요 가 없습니다
    마지막.
    동시 다발 의 내막 을 이해 하 는 것 은 고급 프로그래머 에 게 없어 서 는 안 될 과정 이다.
    레 퍼 런 스
  • 좋은 웹페이지 즐겨찾기