부록 A 동시성2 (4)

책너두 5기 48일차 로버트 C. 마틴의 클린코드 p. 437~ p.446 내용정리 부록 A 동시성 2 다중 스레드 코드 테스트 변수의 현재 값을 기억한다. 스레두 두 개를 새엉하여 각 스레드가 해당 변수에 관한 메서드를 호출한다. 의도에 맞게 값이 변경되었는지 확인한다. 의도와 다르게 변한것이 확인될 때까지 반복한다. 위와 같은 테스트는 아주 드물게 문제가 발생하기 때문에, 일억 번은 돌려야 한다. 따라서 많은 시간이 소모된다. 이를 대체하기 위한 방법들은 다음과 같다. 몬테 카를로 테스트 ...

2023년 9월 30일 · 1 분 · 배준수

부록 A 동시성2 (3)

책너두 5기 47일차 로버트 C. 마틴의 클린코드 p. 429~ p.436 내용정리 부록 A 동시성 2 작업 처리량 높이기 동기화 영역은 언제나 작을수록 좋다. 작업 처리량 계산 - 단일 스레드 환경 다음을 가정한다. 페이지를 읽어오는 평균 I/O 시간 : 1초 페이지를 분석하는 평균 처리 시간: 0.5초 처리는 CPU 100%를 사용, I/O는 CPU 0% 사용 스레드 하나가 N 페이지를 처리한다면 총 실행 시간은 1.5초 * N이다. 작업 처리량 계산 - 다중 스레드 환경 3개의 스레드를 사용한다면? 페이지 읽기 한 번은 페이지 분석 두 번과 겹침이 가능하므로 일 초마다 두 페이지를 처리한다. 따라서 단일스레드보다 처리율이 세 배 높다. ...

2023년 9월 29일 · 2 분 · 배준수

부록 A 동시성2 (2)

책너두 5기 46일차 로버트 C. 마틴의 클린코드 p. 420~ p.428 내용정리 부록 A 동시성2 라이브러리를 이해하라 Executor 프레임워크 스레드 풀링으로 정교한 실행을 지원하는 프레임워크 스레드 풀을 관리하고, 풀 크기를 자동으로 조정하며, 필요하다면 스레드를 재 사용 스레드를 차단하지 않는(non blocking) 방법 최신 프로세서는 거의 지원. CAS(Compare and Swap)라 불리는 연산을 지원 다중 스레드 환경에서 안전하지 않은 클래스 SimpleDateFormat 데이터베이스 연결 java.util 컨테이너 클래스 서블릿 메서드 사이에 존재하는 의존성을 조심하라 두 스레드가 서로를 간섭해 예외가 발생할 가능성이 있다. 해결방안 실패를 용인한다. 클리언트를 바꿔 문제를 해결한다. 즉, 클라이언트-기반 잠금 메커니즘을 구현한다. 서버를 바꿔 문제를 해결한다. 서버에 맞춰 클라이언트도 바꾼다. 즉, 서버-기반 잠금 메커니즘을 구현한다. 실패를 용인한다. 떄로는 실패해도 괜찮도록 프로그램을 조정할 수 있다. ...

2023년 9월 28일 · 1 분 · 배준수

부록 A 동시성2 (1)

책너두 5기 45일차 로버트 C. 마틴의 클린코드 p. 413~ p.419 내용정리 가능한 실행 경로 1 2 3 4 5 6 7 public class IdGenerator { int lastIdUsed; public int incrementValue() { return ++lastIdUsed; } } 스레드 하나가 IdGenrator 인스턴스 하나를 사용한다고 가정하면 가능한 실행 경로, 가능한 결과도 하나다. 반환값은 lastIdUsed 값과 동일하다. 두 값 모두 메서드를 호출하기 전보다 1이 크다. 스레드가 두 개라면? 그래서 각 스레드가 incrementValue 메서드를 한 번씩 호출한다면 결과는 어떨까? lastIdUsed 초깃값을 93으로 가정하면 결과는 다음 중 하나이다. ...

2023년 9월 27일 · 1 분 · 배준수

냄새와 휴리스틱(5)

책너두 5기 44일차 로버트 C. 마틴의 클린코드 p. 404~ p.412 내용정리 17. 냄새와 휴리스틱 테스트 1. 불충분한 테스트 테스트 케이스는 잠재적으로 깨질만한 부분을 모두 테스트해야 한다. 확인하지 않는 조건이나 검증하지 않는 계산이 있다면 그 테스트는 불완전하다. 2. 커버리지 도구를 사용하라 커버리지 도구는 테스트가 빠뜨리는 공백을 시각적으로 알려준다. 3. 사소한 테스트를 건너뛰지 마라 사소한 테스트는 짜기 쉽고 제공하는 문서적 가치는 구현에 드는 비용을 넘어선다. 4. 무시한 테스트는 모호함을 뜻한다 불분명한 요구사항은 테스트 케이스를 주석으로 처리하거나 테스트 케이스에 @ignore를 붙여 표현한다. ...

2023년 9월 26일 · 2 분 · 배준수

동시성(3)

책너두 5기 27일차 로버트 C. 마틴의 클린코드 p. 237~ p.244 내용정리 13.동시성 스레드 코드 테스트하기 지금까지 공부한 것은 스레드가 하나인 프로그램은 지금까지 한 말이 모두 옳다. 하지만 같은 코드와 같은 자원을 사용하는 스레드가 둘 이상으로 늘어나면 다르다. 권장사항: 문제를 노출하는 테스트 케이스를 작성하라. 프로그램 설정과 시스템 설정과 부하를 바꿔가며 자주 돌려라. 실패하면 원인을 추적하라. 스레드가 둘 이상일 때 지침은 다음과 같다. 말이 안 되는 실패는 잠정적인 스레드 문제로 취급하라. 다중 스레드를 고려하지 않은 순차 코드부터 제대로 돌게 만들자. 다중 스레드를 쓰는 코드 부분을 다양한 환경에 쉽게 끼워 넣을 수 있도록 스레드 코드를 구현하라. 다중 스레드를 쓰는 코드 부분을 상황에 맞춰 조정할 수 있게 작성하라. 프로세서 수보다 많은 스레드를 돌려보라. 다른 플랫폼에서 돌려보라. 코드에 보조 코드(instrument)를 넣어 돌려라. 강제로 실패를 일으키게 해보라. 말이 안되는 실패는 잠정적인 스레드 문제로 취급하라 다중 스레드 코드는 아주 드물게 한번씩 나타나서 실패를 재현하기 아주 어렵고 그로 인해 일회성 문제로 치부한다. 그렇게 되면 잘못된 코드위에 코드가 계속 쌓인다. ...

2023년 9월 6일 · 3 분 · 배준수

동시성(2)

책너두 5기 26일차 로버트 C. 마틴의 클린코드 p. 230~ p.237 내용정리 13.동시성 난관 동시성을 구현하기 어려운 이유? 예시 1 2 3 4 5 6 7 public class X { private int lastIdUsed; public int getNextId() { return ++lastIdUsed; } } 인스턴스 X를 생성하고, lastIdUsed 필드를 42로 설정한 다음, 두 스레드가 해당 인스턴스를 공유한다. 두 스레드가 getNextId();를 호출한다고 가정헀을때 결과는? ...

2023년 9월 5일 · 4 분 · 배준수

동시성(1)

책너두 5기 25일차 로버트 C. 마틴의 클린코드 p. 226~ p.229 내용 정리 13. 동시성 동시성과 깔끔한 코드는 양립하기 어렵다. 동시성이 필요한 이유? 동시성은 결합(coupling)을 없애는 전략이다. **무엇(what)**과 **언제(when)**을 분리하는 전략이다. 스레드가 하나인 프로그램은 무엇과 언제가 밀접하다. **무엇(what)**과 **언제(when)**를 분리하면 애플리케이션 구조와 효율이 극적으로 나아진다. 따라서 시스템을 이해하기 쉽고 문제를 분리하기도 쉽다. 예시: 서블릿(Servlet) 서블릿은 웹 혹은 EJB 컨테이너 아래서 돌아가는데 컨테이너는 동시성을 부분적으로 관리한다. 웹 요청이 들어올 때마다 웹 서버는 비동기식으로 서블릿을 실행한다. 원칙적으로 각 서블릿 스레드는 다른 서블릿 스레드와 무관하게 자신만의 세상에서 돌아간다. 서블릿 프로그래머는 동시성을 정확히 구현하도록 각별한 주의와 노력을 기울여야 한다. 그럼에도 서블릿 모델이 제공하는 구조적 이점은 아주 크다. ...

2023년 9월 4일 · 2 분 · 배준수