21년 1월 23일
한 일
-
자바의 정석 Chapter 13 쓰레드 (9.쓰레드의 동기화 ~ 끝) 모두 읽었다.
- synchronized를 이용한 동기화를 배웠다.
- synchornized method와 synchronized block을 이용한 critical section 생성
- 특정 객체가 Lock을 너무 오래 갖는 것을 방지하기 위한 wait와 notify의 사용법을 배웠다.
- JDK1.5부터 추가된 java.util.concurrent.locks 패키지 사용법을 배웠다.
- ReetrantLock, ReetrantReadWriteLock, StampedLock 사용법
- StampedLock은 ReetrantReadWriteLock에 optimisticLock이 추가된 Lock이다.
- optimisticReadLock은 사용하면 바로 lock을 얻지만, 누군가 쓰기 lock을 얻는다면 바로 무효화된다.
- await(), signal()은 synchronized의 wait(), notify()와 대응된다.
- volatile 키워드가 무엇인지 알게 되었다.
- 변수를 원자화한다.
- JVM은 4바이트 단위로 처리하기 때문에, long이나 double 타입은 한번에 읽을수 없다.
- volatile키워드로 선언하면 long이나 double도 다른 쓰레드의 침범 없이 원자화하여 읽을 수 있다.
- 항상 메모리에서 값을 가져온다.
- 멀티 코어에서는 각 코어가 캐시에 저장된 변수를 참조할 수도 있다.
- 즉, 1번 코어에서 메모리에 변수를 바꿔도, 2번 코어는 캐시의 변수를 참조하고 있으면 정상 동작하지 않는다.
- 이를 방지하기 위해서 volatile 키워드로 변수를 선언하여 항상 메모리에서 값을 읽도록 강제해준다.
- 변수를 원자화한다.
- synchronized를 이용한 동기화를 배웠다.
-
프로그래머스 문제 정수삼각형, 등굣길을 풀었다.
-
정수삼각형:
- dp 문제 같긴한데, 그냥 iterative하게 푸는게 더 편하고 빠르다.
- 삼각형의 위층부터 내려오며 각 위치까지 오는데 가장 큰 값들을 계산해서 넣어준다.
- 삼각형의 맨 마지막 층에 각 위치별로 오는데 가장 큰 값이 저장되어 있을 것이다.
- 마지막 층에 저장된 값중 가장 큰 값을 반환한다.
-
등굣길:
- 전형적인 dp문제이다.
- (x,y)의 길의 개수는 (x-1,y)+(x,y-1)가 된다.
- m,n 크기일 때, cache배열을 3차원
new int[m][n][2]
으로 하는 것이 핵심이다. cache[x][y][0]
에는 (x,y)값이 계산이 끝났는지(1), 물 웅덩이인지(-1), 아직 계산이 안됐는지(0)가 저장된다.cache[x][y][1]
에는(x,y)값의 계산이 끝났을 경우 (x,y)값이 저장된다.
-
잘못한 것
- 등굣길 문제를 풀 때, input으로 들어온 x,y좌표 기준과 내가 정의한 x,y좌표 기준이 틀려서 해멨다.
- 문제에서 (1,1)은 내가 설계한 코드에서는 (0,0)을 의미하기 때문에 x,y모두 1씩 빼줘야했다 ㅠㅠ
- 실제 문제였으면 테스트케이스까지만 확인하고 냈으므로 틀렸을 것이다.
- 아주 사소한 문제인데, 또 실수를 해버려서 아쉽다.
잘한 것
- 자바의 정석을 계획한 데로 읽었다.
- 프로그래머스 문제 2문제나 풀었다.
느낌
- 자바의 정석 쓰레드는 운영체제 지식이 없으면 읽기 어려웠을 것 같다.
- 그래도 이해하면서 쓰레드 챕터를 완독할 수 있어서 아주 뿌듯했다.
- 다 외우는게 목적이 아니기 때문에, 이해만으로 넘어가고 앞으로 코딩할때 참고용으로 자주 봐야겠다.
할 일
- 프로그래머스 문제 풀기
- TCP/IP 쉽게 더쉽게 읽기
- 자바의 정석 제너릭스 읽기