2017-01-30 3 views
0

근본적인 수준에서 다음 상황에서 스레드로 전달되는 로컬 변수가 어떻게 될지 이해하려고합니다. 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 키워드에 대해 조금 읽었지만 여기에서 나를 도울 것이라고 확신하지 못합니다.

+0

shutdownhook을 호출하지 않으면 얼마나 심각한가요? 그게 가능 하니까. – Kayaman

+0

shutdownhook이 호출되지 않는 상황에 대해 자세히 설명해 주시겠습니까? – ferahgo

+0

모두 javadoc에 있습니다. – Kayaman

답변

2

아니요 Runtime의 컬렉션에 대해 someObject::delete 메소드 참조를 추가하고 있습니다. Runtime에 여전히 도달 할 수 있기 때문에 이러한 객체에도 접근 할 수 있으므로 GCd를 가져서는 안됩니다.

+0

시작되지 않은 스레드에서 참조되는 것은 말할 것도없고, GC에 적합하지 않다고 확신하는 것조차도 확인합니다. – Kayaman

관련 문제