Java 스레드를 사용하던 중 while문이 제대로 동작하지 않는 경우가 발생해 이에 대해 찾아보았다.
문제가 된 코드
내가 짠 코드의 형태는 아래와 같다.
if문 내에 사용한 변수는 다른 클래스의 클래스변수이다.
new Thread() {
@Override
public void run() {
while(true) {
if(OtherClass.isTrue) {
...
}
}
}
}
thread를 무한 루프 돌리면서 isTrue가 참이 되는 경우에만 작동하기를 원했는데 코드가 돌지 않았다.
무엇이 문제인가 싶어서 아래와 같이 System.out.println()을 넣어봤더니 제대로 동작했다.
new Thread() {
@Override
public void run() {
while(true) {
System.out.println("Test");
if(OtherClass.isTrue) {
...
}
}
}
}
검색
다음은 해당 문제에 대해 찾아본 결과이다.
Questions about thread+loop not working without print statement
Consider the following scenario in Java: A developer has written a loop that waits for some state to be changed from a different thread. The loop doesn't seem to see the change. The developer adds a
meta.stackoverflow.com
이 문제를 겪은 사람들이 많아서 전체적으로 정리를 한 모양이다.
결론 및 해결 방법
찾아본 결과 동기화 문제라는 것을 알게 되었다.
print() 메서드가 있으면 해당 변수에 지속적으로 접근하면서 동기화가 이뤄지는 반면
print() 메서드가 없으면 동기화가 이루어지지 않아 변수를 계속 false로 인식하고 있는 것이다.
이를 해결하기 위해선 synchronized 혹은 volatile을 활용해 동기화 문제를 처리해야 한다.
나의 경우는 변수에 접근한 것이기 때문에 클래스 변수에 volatile을 붙였더니 해결됐다.
'Java > Java' 카테고리의 다른 글
Java - 정규 표현식(Pattern, Matcher) (0) | 2023.09.10 |
---|---|
Java - 정규 표현식(Regex) (0) | 2023.09.05 |
Java - sort() (Comparator & Comparable) (0) | 2023.08.31 |
Java - 중위 - 후위 표기법 변환 & 후위 표기법 계산 (0) | 2023.08.24 |
Java - Java 클래스, 객체, 인스턴스 (0) | 2023.07.16 |