JAVA 병발 1: 자바 병발 프로 그래 밍 안내

추천 읽 기: 아 리 구조 사 는 "실전 이 없 으 면 탁상공론" 이 라 고 직언 했다.레 디 스 실전 PDF 공유
                  분발 하여 반년 여 를 노력 하여 마침내 사방 아 리 가 원 하 는 대로 마음 에 드 는 offer 등급 P7 을 획득 하 였 습 니 다.
                  아 리 P8 구조 사 담: 1 - 5 년 근무 한 자바 엔지니어, 핵심 경 쟁 력 을 어떻게 향상 시 킬 것 인가?
프로필:
​        운영 체제 의 등장 으로 인해 컴퓨터 는 매번 여러 프로그램 을 실행 할 수 있 고 서로 다른 프로그램 은 단독 프로 세 스 에서 실 행 됩 니 다. 운영 체 제 는 각 독립 적 으로 실 행 된 프로 세 스 에 자원 을 분배 합 니 다. 메모리, 파일 핸들 과 안전 인증서 등 을 포함 하고 서로 다른 프로 세 스 간 에 굵 은 입자 의 통신 체 제 를 통 해 데 이 터 를 교환 할 수 있 습 니 다. 이 는 소켓,신호 처리 장치, 공유 메모리, 신 호 량 및 파일 등;한 프로그램 이 처음부터 끝까지 실행 되 는 것 이 아니 라 굵 은 입자 의 시간 분할 (Time Slicing) 을 통 해 사용자 와 프로그램 이 컴퓨터 자원 을 공유 할 수 있 도록 하 는 효율 적 인 운영 방식 이다. 여러 작업 을 계산 할 때 모든 프로그램 이 하나의 임 무 를 수행 하고 필요 할 때 서로 통신 하 는 것 이다.
​        스 레 드 는 경량급 프로 세 스 라 고 불 린 다. 대부분의 현대 운영 체제 에서 스 레 드 를 기본 적 인 스케줄 러 로 하고 프로 세 스 가 아니 라 명확 한 협동 체제 가 없 으 면 스 레 드 는 서로 독립 적 으로 실 행 될 것 이다.스 레 드 는 프로 세 스 범위 내의 자원 을 공유 합 니 다. 예 를 들 어 메모리 핸들 과 파일 핸들, 그러나 모든 스 레 드 는 각자 의 프로그램 카운터, 스 택 과 부분 변수 등 이 있 습 니 다.같은 프로 세 스 의 모든 스 레 드 가 프로 세 스 메모리 주소 공간 을 공유 하기 때문에 이 스 레 드 는 시스템 의 변 수 를 방문 하고 같은 더미 에서 대상 을 분배 할 수 있 습 니 다. 이 는 프로 세 스 간 에 데 이 터 를 공유 하 는 것 보다 더 세밀 한 데이터 공유 체 제 를 실현 해 야 합 니 다. 만약 에 명확 한 동기 화 체제 가 없 으 면 공유 데이터 에 대한 접근 을 협동 해 야 합 니 다.그러면 한 스 레 드 가 특정한 변 수 를 사용 하고 있 을 때 다른 스 레 드 가 이 변 수 를 동시에 방문 하면 예측 할 수 없 는 결 과 를 초래 할 수 있 습 니 다.
우세:
        서버 응용 프로그램 이 여러 원 격 클 라 이언 트 로부터 소켓 연결 요청 을 받 아들 일 때 모든 연결 에 각자 의 스 레 드 를 할당 하고 동기 화 I / O 를 사용 하면 이러한 프로그램의 개발 난이 도 를 낮 출 수 있 습 니 다.
​        만약 어떤 프로그램 이 소켓 에 대해 읽 기 동작 을 실행 하고 데이터 가 오지 않 는 다 면 데이터 가 올 때 까지 계속 막 힐 것 입 니 다.단일 스 레 드 응용 프로그램 에 서 는 요청 을 처리 하 는 과정 에서 중단 되 는 것 을 의미 할 뿐만 아니 라 이 스 레 드 가 차단 되 는 동안 모든 요청 에 대한 처리 가 중단 되 는 것 을 의미 합 니 다. 이 를 피하 기 위해 서 는 단일 스 레 드 서버 응용 프로그램 이 비 차단 I / O 를 사용 해 야 합 니 다. 그 복합 성 은 동기 I / O 보다 훨씬 높 고 오류 가 발생 하기 쉽 습 니 다.그러나 모든 요청 에 자신의 처리 스 레 드 가 있다 면 어떤 요청 을 처리 할 때 발생 하 는 차단 은 다른 요청 의 처리 에 영향 을 주지 않 습 니 다.
위험:
1. 안전성 문제:
        여러 스 레 드 가 같은 메모리 주소 공간 을 공유 하고 동시에 실행 해 야 하기 때문에 다른 스 레 드 가 사용 하고 있 는 변 수 를 방문 하거나 수정 할 수 있 습 니 다. 결 과 는 동기 화 되 지 않 은 상황 에서 스 레 드 는 예상 치 못 한 데이터 변화 로 인해 오류 가 발생 할 수 있 습 니 다.
​         동기 화 되 지 않 으 면 컴 파일 러, 하드웨어, 실행 시 작업 의 실행 시간 과 순 서 를 마음대로 배정 할 수 있 습 니 다. 예 를 들 어 레지스터 나 프로세서 의 변 수 를 캐 시 할 수 있 습 니 다. 캐 시 된 변 수 는 다른 스 레 드 에 있어 서 일시 적 으로 (영구적 으로) 보이 지 않 습 니 다.
@NotThreadSafe
public class UnsafeSequence{
  private int value;
    public int getNext(){
        return value++;
    }
}

        사실 value + + 는 세 개의 독립 된 동작 을 포함 합 니 다. value, value + 1 을 읽 고 계산 결 과 를 value 에 기록 합 니 다.
        실행 할 때 여러 스 레 드 간 의 작업 이 교체 되 어 실행 되 기 때문에 읽 기 작업 을 동시에 실행 하여 같은 값 을 얻 고 1 을 추가 할 수 있 습 니 다. 결 과 는 서로 다른 스 레 드 호출 에서 같은 수 치 를 되 돌려 주 는 것 입 니 다.
2. 활약 성 문제:
​         활성 화 는 특정한 정확 한 일이 최종 적 으로 발생 한 다 는 것 을 의미한다. 직렬 프로그램, 즉 무한 순환 으로 인해 순환 후의 코드 가 실 행 될 수 없다. 예 를 들 어 스 레 드 A 는 스 레 드 B 가 가지 고 있 는 자원 을 방출 하 기 를 기다 리 고 스 레 드 B 는 이 자원 을 영원히 방출 하지 않 으 면 A 는 영구적 으로 기다 릴 것 이다.
3. 성능 문제:
​         장면: 다 중 스 레 드 프로그램 에서 스 레 드 스케줄 러 가 임시 적 으로 활성 스 레 드 를 걸 고 다른 스 레 드 를 실행 할 때 문맥 전환 작업 이 자주 발생 합 니 다. 이런 작업 은 큰 비용 을 가 져 옵 니 다. 컨 텍스트 를 저장 하고 복원 하 며 국부 성 을 잃 습 니 다. 또한 CPU 는 스 레 드 가 아 닌 스 레 드 스 케 쥴 링 에 더 많이 사 용 됩 니 다.스 레 드 가 데 이 터 를 공유 할 때 반드시 동기 화 체 제 를 사용 해 야 한다. 이런 체 제 는 일부 컴 파일 러 의 최적화 를 억제 하여 메모리 캐 시 구역 의 데 이 터 를 무효 로 하고 공유 메모리 버스 의 동기 화 트 래 픽 을 증가 하면 추가 적 인 성능 비용 을 가 져 올 것 이다.
 
필드 분석:
         JVM 이 시 작 될 때 JVM 의 내부 작업 (예, 쓰레기 회수, 종료 작업 등) 을 위해 배경 스 레 드 를 만 들 고 메 인 방법 을 실행 하 는 메 인 스 레 드 를 만 듭 니 다.
         AWT 와 Swing: AWT 와 Swing 의 사용자 인터페이스 프레임 워 크 는 사용자 인터페이스 이 벤트 를 관리 하기 위해 스 레 드 를 만 듭 니 다.사용자 가 UI 동작 을 시작 할 때 이벤트 스 레 드 에 사용자 가 요청 한 동작 을 수행 하기 위해 이벤트 프로세서 가 호출 됩 니 다. 이벤트 프로세서 가 다른 스 레 드 에서 동시에 접근 하 는 프로그램 상태 (예 를 들 어 문서 편집) 에 접근 해 야 한다 면 이 이벤트 프로세서 는그리고 이 상태 에 접근 하 는 모든 다른 코드 는 하나의 스 레 드 보안 방식 으로 이 상태 에 접근 해 야 합 니 다.
         Timer: Timer 는 지연 작업 을 수행 하기 위해 스 레 드 를 만 들 것 입 니 다.Timer Task 는 Timer 가 관리 하 는 스 레 드 에서 실 행 됩 니 다. 만약 Task 가 다른 스 레 드 에 접근 한 데 이 터 를 방문 했다 면 Task 는 스 레 드 안전 방식 으로 데 이 터 를 방문 해 야 합 니 다. 다른 클래스 도 스 레 드 안전 방식 으로 이 데 이 터 를 방문 해 야 합 니 다.이 목 표를 실현 하 는 가장 간단 한 방법 은 공유 대상 내부 에 스 레 드 를 안전하게 밀봉 하여 Task 방문 대상 자체 가 스 레 드 안전 을 확보 하 는 것 이다.
        Servlet 과 JavaServer Page: 서버 에 도착 하 는 요청 은 하나의 필터 체인 을 통 해 정확 한 Servlet 또는 JSP 로 배 포 됩 니 다. 여러 클 라 이언 트 가 같은 Servlet 서 비 스 를 동시에 요청 하거나 Servlet 이 여러 스 레 드 에 동시에 호출 되면 스 레 드 안전 을 확보 해 야 합 니 다.하나의 스 레 드 만 하나의 Servlet 을 호출 하 는 것 을 확보 하 더 라 도 이 Servlet 은 다른 여러 Servlet 과 공유 하 는 정 보 를 방문 할 수 있 습 니 다. 예 를 들 어 Servlet Context 나 세 션 HttpSession 에 저 장 된 대상 도 이 대상 에 대한 접근 을 정확하게 협동 하여 스 레 드 안전 을 실현 해 야 합 니 다.
        원 격 방법 호출 (RMI, RMI 는 다른 JVM 에서 실행 되 는 대상 을 호출 할 수 있 습 니 다): 원 격 대상 을 호출 할 때 RMI 가 관리 하 는 스 레 드 에서 이 대상 을 호출 합 니 다. 같은 원 격 대상 의 같은 원 격 방법 은 여러 RMI 스 레 드 에서 동시에 호출 되 므 로 여러 대상 에서 공유 하 는 상 태 를 정확하게 협동 해 야 합 니 다.원 격 대상 자체 상태 에 대한 접근 (같은 대상 이 여러 스 레 드 에서 동시에 접근 할 수 있 기 때문에) 은 자신의 스 레 드 안전성 을 확보 해 야 합 니 다.

좋은 웹페이지 즐겨찾기