일단 씻고 나가자
24.06.19 본문
2024. 06. 19 수요일
- dp로 부분합의 최대를 구하는 알고리즘?
: 기존 배열의 크기만큼 dp 배열을 잡아놓고, dp[0] = 기존 배열[0]으로 초기화 후,
for문 (i=1)을 돌며 dp[i] = Math.max(dp[i-1] + 배열[i], 배열[i]) 계산하고 매 순간 max 값을 갱신해주면 된다. 이는 이전까지 계산한 max값 보다 현재 나 스스로의 값이 더 크다면 내 스스로 값으로 초기화하고, 그 값을 또 다른 새로운 부분합의 시작점으로 잡는 원리이다.
- [Effective Java] volatile 키워드란? singleton의 동시성을 보장하는 효율적인 방법?
: Java는 일반적으로 성능 향상을 위해 메인 메모리로부터 읽어온 값을 CPU 캐시에 저장하고 사용한다. 하지만 멀티 쓰레드 환경의 경우 여러 CPU가 존재하고, 따라서 각 쓰레드가 다른 값을 사용할 위험이 있다.
volatile은 휘발성이란 뜻이며, 말대로 휘발성 메모리에 값을 저장하라는 의미이다.
volatile 키워드를 변수 앞에 붙이면 해당 변수는 읽기, 쓰기 활동을 모두 메인 메모리에서 수행하게 되고, 이는 해당 값에 가시성을 보장할 수 있다. 보통 volatile 변수는 singleton을 보장할 때 활용하며, 따라서 static을 대신하여 활용할 수 있다.
singleton의 경우, 해당 변수를 static하게 선언하고
getInstance() {if(변수 == null) return new 객체();}처럼 활용하는데, 이때 동시에 여러 쓰레드가 접근할 경우 동시성 이슈가 발생하므로 해당 메서드를 synchronized 선언하여 활용하여야 한다. 이 경우엔 메서드 전체에 synchronized가 걸리기에 성능 문제가 생기므로 생성자 윗 단계인 변수 선언 단계에서부터 private static final singletonObj = new.. 로 선언하면 성능을 보완할 수 있다.
static이 아닌 instance field의 경우 volatile을 선언하는데 이 경우에도 동시성을 보장하진 못한다. 초기화 이후엔 동시성이 필요하지 않은 경우 (필요하다면 메서드에 synchronized 활용) 메서드 내에서 null일 로직에서만 synchronized(this)를 선언하여 활용할 수 있다.