
동시성과 깔끔한 코드는 양립하기 어렵다
동시성은 결합을 없애는 전략ㅇ이다 즉 무엇 과 언제를 분리하는 전략이다.
스레드가 하나인 프로그램은 무엇과 언제가 서로 밀접하다.
그래서 호출 스택을 살펴보면 프로그램 상태가 곧바로 드러난다.
무엇과 언제를 분리하면 애플리케이션 구조와 효율이 극적으로 나아진다.
미신과 오해
동시성을 항상 성능을 높여준다.
동시성을 구현해도 설계는 변하지 않는다.
웹 또는 EJB 컨테이너를 사용하면 동시성을 이해할 팔요가 없다.
동시성과 관련된 타당한 생각
단일 책임원칙
따름 정리 : 자료 범위를 제한하라
객체를 사용하는 코드 내 임계영역을 synchronized 키워드로 보호하라고 권장한다.
자료를 캡슐화 하라 공유 자료를 최대한 줄여라
따름 정리 : 자료 사본을 사용하라
공유 자료를 줄이려면 처음부터 공유하지 않는 방법이 제일 좋다.
공유 객체를 피하는 방법이 있다면 코드가 문제를 일으킬 가능성도 아주 낮아진다.
따름 정리: 스레드는 가능한 독립적으로 구현하라
자신만의 세상에 존재하는 스레드를 구현하라. 즉 다른 스데르와 자료를 공유하지 않는다.
모든 정보는 비공유 출처에서 가져오며 로컬 변수에 저장한다.
독자적인 스레드로 가능하면 다른 프로세서에서 돌려도 괜찮도록 자료를 독립적인 단위로 분할하라
언어가 제공하는 클래스를 검토하라
다중 스레드 애플리케이션을 분류하는 방식은 여러가지다.
생산자- 소비자
하나 이상 생산자 스레드가 정보를 생성해 버퍼나 대기열에 넣는다.
하나 이상 소비자 스레드가 대기열에서 정보를 가져와 사용한다.
여기서 사용하는 대기열은 한정된 자원이다.
잘못하면 생산자 스레드와 소비자 스레드가 둘 다 진행 가능함에도 불구하고 동시에 서로 에게서 시그널을 기다릴 가능성이 존재한다.
읽기-쓰기
읽기 스레드를 위한 주된 정보원으로 공유 자원을 사용하지만, 쓰기 스레드가 이 공유 자원을 이따금 갱신한다고 하면 처리율이 문제의 핵심이다.
읽기 스레드의 요구와 쓰기 스레드의 오규를 적절히 만족시켜 처리율도 적당히 높이고 기아도 방지하는 해법이 필요하다.
간단한 전략은 읽기 스레드가 없을때까지 갱신을 원하는 쓰기 스레드가 버퍼를 기다리는 방법이다.
식사하는 철학자들
유명한 철학자들 문제를 각 알고리즘을 공부하고 해법을 직접 구현해보라
동기화하는 메서드 사이에 의존성이 존재하면 동시성 코드에 찾아내기 어려운 버그가 생긴다.
공유 객체 하나에는 메서드 하나만 사용하라
여러 메서드가 필요한 상황이 생긴다. 그럴때 세가지 방법을 사용하라
자바에서 synchronized 키워드를 사용하면 락을 설정한다. 같은 락으로 감싼 모든 코드 영역은 한번에 한 스레드만 실행 가능하다.
필요 이상으로 임계 영역 크기를 키우면 스레드 간에 경쟁이 늘어나고 프로그램 성능이 떨어진다.
깔끔하게 종료하는 코드를 구현하는 곳에서 발생하는 문제가 데드락이다.
종료 코드를 개발 초기부터 고민하고 동작하게 초기부터 구현하라. 생각보다 오래 걸린다. 생각보다 어려우므로 이미 나온 알고리즘을 검토하라
코드가 올바르다고 증명하기 는 현실적으로 불가능하다. 테스트가 정확성을 보장하지 않지만 충분한 테스트는 위험을 낮춘다.
문제를 노출하는 테스트 케이스를 작성하라. 프로그램 설정과 시스템 설정과 부하를 바꿔가며 자주 돌려라 테스트가 실패하면 원인을 추적하라. 다시 돌렸더니 통과하더라는 이유로 그냥 넘어가면 절대로 안된다.
고
구체적인 지침을 제시