package thread.control.volatile1;
import static thread.util.MyLogger.log;
import static thread.util.ThreadUtils.sleep;
public class VolatileFlagMain {
public static void main(String[] args) {
MyTask myTask = new MyTask();
Thread t = new Thread(myTask, "work");
log("runFlag = " + myTask.runFlag);
t.start();
sleep(1000);
log("runFlag를 false로 변경 시도");
myTask.runFlag = false;
log("runFlag = " + myTask.runFlag);
log("main 종료");
}
static class MyTask implements Runnable {
boolean runFlag = true;
// volatile boolean runFlag = true; // 캐시 메모리가 아닌 메인 메모리에 직접 접근 (읽을 때도 항상 메인 메모리 활용)
@Override
public void run() {
log("task 시작");
while(runFlag){
}
log("task 종료");
}
}
}
main 스레드는 새로운 스레드인 work 스레드를 생성하고 작업을 시킨다.work 스레드는 run() 메서드를 실행하면서 while(runFlag)가 true인 동안 계속 작업을 한다.runFlag가 false로 변경되면 반복문을 빠져나오면서 task 종료를 출력하고 작업을 종료한다.main 스레드는 sleep()을 통해 1초간 쉰 다음 runFlag를 false로 설정한다.
09:08:22.458 [ main] runFlag = true
09:08:22.461 [ work] task 시작
09:08:23.470 [ main] runFlag를 false로 변경 시도
09:08:23.470 [ work] task 종료
09:08:23.470 [ main] runFlag = false
09:08:23.471 [ main] main 종료
09:07:40.860 [ main] runFlag = true
09:07:40.863 [ work] task 시작
09:07:41.873 [ main] runFlag를 false로 변경 시도
09:07:41.873 [ main] runFlag = false
09:07:41.873 [ main] main 종료
분명 runFlag를 false로 변경했지만 while을 탈출하지 못한다. 왜일까?

main 스레드와 work 스레드는 각각의 CPU 코어에 할당되어 실행된다.