근본적인 수준에서 다음 상황에서 스레드로 전달되는 로컬 변수가 어떻게 될지 이해하려고합니다. delete
메서드가있는 someObject
에서 정리 작업이 필요합니다.이 메서드는 someObject 인스턴스를 해당 멤버 인 id
으로 삭제하는 외부 API를 호출합니다.인수를 새 스레드로 전달할 때 로컬 변수 참조 및 GC
public interface Deleteable {
public delete()
}
public SomeClass implements Deleteable {
int id;
public void delete() {
HttpApiCall.deleteById(this.id);
}
}
SomeClass someObject = null;
for(i = 0; i < 3; i++) {
// simple loop to illustrate problem
someObject = new SomeClass();
Runtime.getRuntime()
.addShutdownHook(new Thread(someObject::delete));
}
프로그램이 실행되는 동안은 SomeClass의 인스턴스의 일부는 스레드가 삭제 호출 할 수 전에 GC'ed 것인가? 각 스레드는 새로 만들어진 자체 사본을 수신합니까 아니면 마지막 설정 값 someObject
에서 작동합니까?
나는 volatile
키워드에 대해 조금 읽었지만 여기에서 나를 도울 것이라고 확신하지 못합니다.
shutdownhook을 호출하지 않으면 얼마나 심각한가요? 그게 가능 하니까. – Kayaman
shutdownhook이 호출되지 않는 상황에 대해 자세히 설명해 주시겠습니까? – ferahgo
모두 javadoc에 있습니다. – Kayaman