funmain(){repeat(3){valworker=VolatileWorker()// worker 쓰레드 생성
worker.start()// worker 쓰레드 시작
Thread.sleep(100)// 메인 쓰레드 잠시 수면
println("stop을 true로 변경")worker.stop=true// worker쓰레드의 stop 플래그 변경
worker.join()// worker 쓰레드가 끝날 때까지 메인쓰레드에서 대기
}println("작업 종료")}classVolatileWorker:Thread(){@Volatilevarstop=falseoverridefunrun(){super.run()while(!stop){}}}classWorker:Thread(){varstop=falseoverridefunrun(){super.run()while(!stop){}}}
현재 실행되고 있는 프로그램의 변수의 값을 읽기 위해서는 main메모리 혹은 cpu캐시에서 데이터를 읽어오게 된다
cpu캐시에 데이터가 있을 경우, main메모리가 아닌, cpu캐시에서 읽어오는 것이 더 효율적이기에 cpu캐시에서 데이터를 읽어온다
하지만 cpu캐시에서 계속 데이터를 읽어올경우, 다른 쓰레드에서 변경한 데이터를 읽지 않아 변경을 확인하지 못하는 문제가 발생할 수 있다
이때 변수에 @Volatile을 사용하면 해당 변수는 항상 main메모리에서만 데이터를 읽고 쓰기에 최신의 데이터에 대한 동작을 보장받을 수 있다