일반적으로 강의 17에 c 예제가 있는데
volatile
, 변수가 isCancel
사용되지 않으면 volatile
다른 스레드에서 이 변수의 값을 변경하면 다른 스레드에서 이를 알 수 없다는 내용입니다. 예제를 다시 작성했습니다. 메서드에 run
스레드 이름과 값이 표시되는데 isCancel
변수 유무에 관계없이 모든 흐름에 대해 값이 여전히 변경되는 것으로 나타났습니다 volatile
. 노크를 해도 완전히 혼란스럽습니다. 동기화를 알아냈는데 volatile
혼란스러워서 어떤 방식으로도 적용할 수 없습니다. 어쩌면 내가 예제를 잘못 만든 건 아닐까? 또한 클래스를 만들고 Clock
에서 상속 Thread
하고 main
두 개의 인스턴스를 만들어 둘 다 실행하려고 시도했지만 volatile
작동하지 않았습니다. 도와주세요. 그렇지 않으면 미칠 것입니다)
public static void main(String[] args)
{
Clock n = new Clock();
Thread thread1 = new Thread(n);
Thread thread2 = new Thread(n);
thread1.start();
thread2.start();
try
{
Thread.sleep(3000);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
n.cancel();
}
public static class Clock implements Runnable
{
private volatile boolean isCancel = false;
public void cancel()
{
this.isCancel = true;
}
@Override
public void run()
{
while (true)
{
try
{ System.out.println(Thread.currentThread().getName()+" "+isCancel);
Thread.sleep(2000);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
}
}
GO TO FULL VERSION