하루에 한 챕터씩 이팩티브 자바랑 클린코드를 읽고 쓴다 다짐한지 어연지 2주 벌써 지켜지지 못했다. ...
뭐 변명좀 하자면 주말에 몸이 정말 안좋았다. 후우
우선 이번 챕터는 동시성 이다.
동시성이란 멀티 스레드를 사용하는 프로그램을 말한다
사실 멀티스레드를 크게 다루어 본적이 없어 이번 챕터는 그냥 가볍게 읽은거 같다.
단일 스레드는 무엇을 언제 실행하는지 예상할 수 있다.
디버깅 하기엔 좋지만 작업 효율은 떨어진다
ex) 카카오톡 알림톡 유저 100명에세 보낼시 (명당 1초라 가정)
100초가 걸린다
허나 스레드가 3일경우 33초가 걸린다

동시성은 항상 성능을 높여 준다 .
동시성을 구현해도 설계는 변하지 않는다
웹 또는 EJB 컨테이너를 사용하면 동시성을 이해할 필요가 없다
public class Sequence{
private int seq = 7;
public int getNextSeq(){
return ++seq;
}
}
위 코드를 보면
x,y 두개 스레드가 동시 호출시
1. x가 8, y가 9를 받는다. seq는 10이 된다.
2. x가 9, y가 8을 받는다. seq는 10이 된다.
3. x가 8, y가 8을 받는다. seq는 9가 된다. (?)
1 과 2 와 같은 답을 원했지만 3이 호출될 경우 동시성 보장이 안된 경우 이다.
이처럼 대다수는 올바른 결과를 내지만, 문제는 잘못된 결과를 내놓는 일부가 존재한다는 것 이다.
단일 책임 원칙은 여기서도 나온다
SRP 클래스 메소드를 변경할 이유는 1가지 여야한다. 책임이 1개 여야한다 .
자료를 캡슐화하여 공유 자료 최대한 줄여라
앞서 말한 임계 영역을 사용하지 않을 거면 사본을 사용하는 것도 방법
공유 자료를 복사해 대체할 수 있는 경우 사용
복사 vs 임계 영역 대한 부하가 걱정일시 테스트를 해보자
독자적인 스레드로 가능하면 다른 프로세서에서 돌려도 괜찮도록 자료를 독립적인 단위로 분할
자바에선 이미 동시성 위한 클래스 가 있다 java.util.concurrent, java.util.concurrent.atomic, java.util.concurrent.locks 살펴보자
한정된 자원
상호 배제
기아
데드락
라이브락
생성자 소비자
읽기 쓰기
식사하는 철학자들
동기화 하는 메서드 사이에 의존성이 존재하면 동시성 코드 찾아내기 어려운 버그 생긴다
공유 클래스 하나에 동기화 된 메서드 여럿이라면 구현이 올바른지 다시 한번 확인해야한다
공유 객체 하나에는 메서드 하나만 사용하기
공유 객체 하나에 여러 메서드 필요시
클라이언트 에서 잠금 : 클라이언트에서 첫 메서드를 호출하기 전 서버 잠금
서버에서 잠금: 서버를 잠그고 모든 메서드 호출한 후 잠금을 해제하는 메서드 구현
연결서버 : 잠금을 수행하는 중간 단계 생성
락은 스레드 지연시키고 부하 가중시킨다
synchronized 를 남발하면 안된다
코들르 짤때 임계 영역수를 최대한 줄여야한다
그렇다고 임계영역을 키우면 스레드간 경쟁이 늘어나 성능이 떨어진다
종료코드를 개발 초기부터 고민하고 동작하게 구현하라
말이 안되는 실패는 잠정적인 스레드 문제로 취급한다
멀티 스레드 개발 전 단일 스레드 환경에서 돌아가게 만들기
다양한 환경에서 돌리기
스레드 수 쉽게 조절할 수 있게 코드를 작성하기
프로세서 수 보다 많은 스레드 돌려보기
다른 플랫폼 돌려보기
코드에 보조 코드 넣어 강제 실패 일으키기
확실히 웹 (스프링) 을 이용해서 그런가 그동안 스레드에 관한 고민이 없던것 같다
뭐 이것도 오해였지만 그레서 아직 스레드에 개념이 제대로 잡히지 못하여 이번 내용은 특히 더 읽기 어려웠던것 같다. 스레드에 개념이 조금 잡힌 후 다시 해당 챕터를 읽어봐야 할 것 같다.