는 다음 코드를 고려하십시오 필드를 휘발성으로 선언해야합니까?
class Foo {
java.util.Timer timer = new java.util.Timer();
void doAction() {
...
timer.schedule(new SomeTimerTask(), 0L);
...
}
void cancelAction() {
timer.cancel();
}
}
방법
가 다른 스레드에서 호출된다. 메소드 doAction()이 먼저 호출됩니다.다른 스레드에서 timer
필드 volatile
을 표시해야합니까?
@RuslanZagirov 휘발성 (Volatile)은 모든 잠금에 관여하지 않고 스레드에 동시 액세스를 제공하지만 키워드 동기화는 개체에 대한 잠금을 획득하여 리소스를 잠급니다. 이제는 다른 스레드가이 리소스에 액세스 할 때까지 스레드가 개체 잠금을 얻었습니다, 그것을 풀어 ... 그때 다른 스레드가 잠금을 얻을 ... 지금 여기이 스레드는 이전 스레드에 의해 변경된 필드의 값을 참조 ..... –
그러나이 경우 타이머의 작업은'synchronized' 블록에서 실행하지 않아도됩니다. 왜냐하면 javadoc은 스레드로부터 안전하다고 말하기 때문입니다. –