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 키워드가 무엇인지 알게 되었다.
      • 변수를 원자화한다.
        1. JVM은 4바이트 단위로 처리하기 때문에, long이나 double 타입은 한번에 읽을수 없다.
        2. volatile키워드로 선언하면 long이나 double도 다른 쓰레드의 침범 없이 원자화하여 읽을 수 있다.
      • 항상 메모리에서 값을 가져온다.
        1. 멀티 코어에서는 각 코어가 캐시에 저장된 변수를 참조할 수도 있다.
        2. 즉, 1번 코어에서 메모리에 변수를 바꿔도, 2번 코어는 캐시의 변수를 참조하고 있으면 정상 동작하지 않는다.
        3. 이를 방지하기 위해서 volatile 키워드로 변수를 선언하여 항상 메모리에서 값을 읽도록 강제해준다.


  • 프로그래머스 문제 정수삼각형, 등굣길을 풀었다.

    1. 정수삼각형:

      1. dp 문제 같긴한데, 그냥 iterative하게 푸는게 더 편하고 빠르다.
      2. 삼각형의 위층부터 내려오며 각 위치까지 오는데 가장 큰 값들을 계산해서 넣어준다.
      3. 삼각형의 맨 마지막 층에 각 위치별로 오는데 가장 큰 값이 저장되어 있을 것이다.
      4. 마지막 층에 저장된 값중 가장 큰 값을 반환한다.
    2. 등굣길:

      1. 전형적인 dp문제이다.
      2. (x,y)의 길의 개수는 (x-1,y)+(x,y-1)가 된다.
      3. m,n 크기일 때, cache배열을 3차원 new int[m][n][2] 으로 하는 것이 핵심이다.
      4. cache[x][y][0] 에는 (x,y)값이 계산이 끝났는지(1), 물 웅덩이인지(-1), 아직 계산이 안됐는지(0)가 저장된다.
      5. cache[x][y][1] 에는(x,y)값의 계산이 끝났을 경우 (x,y)값이 저장된다.

잘못한 것

  • 등굣길 문제를 풀 때, input으로 들어온 x,y좌표 기준과 내가 정의한 x,y좌표 기준이 틀려서 해멨다.
    • 문제에서 (1,1)은 내가 설계한 코드에서는 (0,0)을 의미하기 때문에 x,y모두 1씩 빼줘야했다 ㅠㅠ
  • 실제 문제였으면 테스트케이스까지만 확인하고 냈으므로 틀렸을 것이다.
  • 아주 사소한 문제인데, 또 실수를 해버려서 아쉽다.

잘한 것

  • 자바의 정석을 계획한 데로 읽었다.
  • 프로그래머스 문제 2문제나 풀었다.

느낌

  • 자바의 정석 쓰레드는 운영체제 지식이 없으면 읽기 어려웠을 것 같다.
  • 그래도 이해하면서 쓰레드 챕터를 완독할 수 있어서 아주 뿌듯했다.
  • 다 외우는게 목적이 아니기 때문에, 이해만으로 넘어가고 앞으로 코딩할때 참고용으로 자주 봐야겠다.

할 일

  • 프로그래머스 문제 풀기
  • TCP/IP 쉽게 더쉽게 읽기
  • 자바의 정석 제너릭스 읽기