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 코어에 할당되어 실행된다.