티스토리 뷰

시작

이전의 AtomicLong 클래스의 updateAndGet 메소드를 사용해 

한 인스턴스를 여러 스레드에서 안전하게 사용하는 법을 공부했었다.


그런데 동일한 원자값을 접근하는 스레드가 많은 경우에는 원자값을 사용중인지에 대해

검사를 엄청 해야하므로 성능이 떨어진다.


이럴땐 LongAdder와 LongAccumulator 클래스를 이용한다.





LongAdder


LongAdder 클래스는 각각을 모두 합하면 현재값이 되는 여러 변수로 구성되어있다.

여러 스레드가 서로 다른 인스턴스 변수를 업데이트하고 스레드가 증가하면 새로운 인스턴스가

제공된다. 즉 모든 스레드에 각각 다른 인스턴스 변수를 제공함으로써 경쟁을 줄이고

여러 스레드가 한 인스턴스 변수를 수정하는 일이 없도록 하는 것이다.


LongAdder의 메소드는 다음과 같다

increment() : 카운터를 증가

sum() : 합계를 추출

add() : 수량을 추가




LongAccumulator


LongAccumulator는 누적연산이다.


ex) LongAccumulator acc = new LongAccumulator(Long::sum, 0);

acc.accumulate(10);


LongAccumulator의 원리는 내부적으로 a[0]...a[n]의 변수가 있다.

예제처럼 accumulate(10) 메소드를 호출하면 a[0]에 인자로 받은 10과 생성자의 두번째 인자로 받은

초기값 0이 합쳐져 10+0의 결과가 a[0]에 들어가고,

계속 accumulate 메소드를 호출할수록 a[n]번째에 이처럼 인자+초기값의 결과가 누적된다.


LongAccumulator를 사용할 때 주의할 점은 생성자의 첫번째인자로 들어가는 함수의 연산은

결합법칙과 교환법칙이 성립해야한다.

이는 즉 최종연산의 결과가 중간값을 결합하는 순서와 상관없이 같아야한다는 말이다.





Accumulator와 Adder는 Long뿐만 아니라 Integer, Double 타입들도 사용할 수 있다.



댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2025/06   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함