새소식

반응형
Java

(Java) Thread와 Thread Local 등을 사용 할 때 발생 할 수 있는 위험 요소와 이에 대한 해결 방안에 대하여 (feat.Atomic Type, volatile, synchronized)

  • -
반응형

동시성 문제가 발생 할 수 있습니다.

Thread를 특정 기능 및 로직에 의해 반복문 안에서 여러번 생성하고 실행되었을때 데이터 충돌이 일어나 동시성 문제가 발생합니다.

결괏값이 순차적으로 나오지 않는 논리적 문제가 발생하여 쓰레드 안정이 깨지는 상황이 발생합니다. 코드로 예를 들어 보겠습니다. 아래는 간단하게 사용자들이 회사 홈페이지를 조회하면 카운트가 올라가는 코드입니다.

 

count-main-classes

 

코드를 run 했을 때 스레드로 조회하는 횟수가 100이고 그 횟수를 100번 더 반복하여 10000번의 조회가 나올 것을 예상할 수 있습니다. 하지만 결과는 다음과 같습니다. print되는 숫자들이 동시성이 없으며 순차적이지 않습니다.

 

result1

 

동시성 문제는 Java Atomic Type, volatile, synchronized 같은 방법으로 쉽게 해결할 수 있습니다.

다만 volatile++ 연산과 같이 원자성이 보장되지 않는 경우에는 동시성 문제가 그대로

발생하므로 이번 예제에는 적합하지 않습니다.

 

반응형

 

Atomic Type으로 해결한 예제 코드 입니다.

 

count-main-classes2
result2

 

synchronized로 해결한 예제 코드 입니다.

count-main-classes3

 

반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.