[java] 스레드 내부 공유 변수의 문제점

자바에서 스레드를 사용하여 여러 작업을 동시에 처리할 수 있습니다. 하지만 스레드 간의 공유 변수를 사용할 때에는 주의가 필요합니다. 스레드 내부에서 공유되는 변수는 동시에 접근하여 변경될 수 있기 때문에 예기치 않은 결과를 초래할 수 있습니다. 이번 글에서는 스레드 내부 공유 변수의 주요 문제점에 대해 알아보겠습니다.

1. 경쟁 상태 (Race condition)

스레드 간에 공유 변수를 동시에 변경하면 경쟁 상태가 발생할 수 있습니다. 경쟁 상태는 스레드 실행 순서에 따라 결과가 달라지는 상황을 의미합니다. 예를 들어, 두 개의 스레드가 공유 변수를 동시에 1씩 증가시킨다면, 예상되는 최종 결과는 2가 되지만, 스레드 실행 순서에 따라 결과가 달라질 수 있습니다.

2. 원자성 (Atomicity)

원자성은 한 번에 완전히 실행되거나 전혀 실행되지 않는 특성을 의미합니다. 스레드가 공유 변수를 여러 단계로 나누어 변경할 때, 다른 스레드가 중간 단계에서 공유 변수에 접근하면 원자성이 깨지게 됩니다. 예를 들어, 한 스레드가 공유 변수의 값을 읽고 1을 더하려고 할 때, 다른 스레드가 값을 읽기 전에 변경되어 예상치 못한 결과가 발생할 수 있습니다.

3. 가시성 (Visibility)

가시성은 한 스레드에서 변경된 변수의 값을 다른 스레드에서 얼마나 빠르게 인지할 수 있는지를 의미합니다. 스레드가 공유 변수를 변경하면서 캐시를 사용할 경우, 다른 스레드에서는 변경된 값을 인지하지 못할 수 있습니다. 이로 인해 다른 스레드에서는 오래된 값이 유지되고, 잘못된 결과를 초래할 수 있습니다.

4. 동기화 (Synchronization)

스레드 간의 공유 변수를 안전하게 사용하기 위해서는 동기화를 사용해야 합니다. 자바에서는 synchronized 키워드를 사용하여 동기화를 구현할 수 있습니다. 동기화를 사용하면 스레드 간에 임계 영역을 설정하여 동시에 공유 변수에 접근하는 것을 막을 수 있습니다.


스레드 내부 공유 변수에 대한 문제점을 이해하고 동기화를 적절히 사용하여 안전하게 공유 변수를 관리하는 것은 중요합니다. 이를 통해 스레드 간의 경쟁 상태나 예상치 못한 결과를 방지할 수 있습니다.

참고 문서: