inflearn logo
강의

Course

Instructor

Effective Java Complete Guide Part 1

Item 7. Perfect Guide 20 - WeakHashMap

PhantomReference 가 소멸되는 시점을 보는 코드 부분이 약간 이상한것 같습니다.

545

wjdrnjsgh1595346

9 asked

1

public class PhantomReferenceExample {

    public static void main(String[] args) throws InterruptedException {
        BigObject strong = new BigObject();
        ReferenceQueue<BigObject> rq = new ReferenceQueue<>();

        BigObjectReference<BigObject> phantom = new BigObjectReference<>(strong, rq);
        strong = null;

        System.gc();
        Thread.sleep(3000L);

        // TODO 팬텀은 유령이니까..
        //  죽었지만.. 사라지진 않고 큐에 들어갑니다.
        System.out.println(phantom.isEnqueued());

        Reference<? extends BigObject> reference = rq.poll();
        BigObjectReference bigObjectCleaner = (BigObjectReference) reference;
        bigObjectCleaner.cleanUp();
        reference.clear();
    }
}

위에 코드에서 커스텀하게 만든 BigObjectReference 로 형변환을 하고 cleanUp을 따로 호출 하는 부분이 이해가 잘 가지 않습니다.

cleanUp 메서드도 단순히 출력만하는데

굳이나 상속을 받아서 커스텀하게 만든 형태가 만든게 무의미한 것 같습니다.

 

기선님이 의도한 소멸되는 시점을 확인하고자 하면 아마 아래와 같이 clear 메서드를 오버라이딩하는게 좀 더 맞지 않나 조심 스럽게 의견을 내봅니다.

public class BigObjectReference<BigObject> extends PhantomReference<BigObject> {
	public BigObjectReference(BigObject referent, ReferenceQueue<? super BigObject> q) {
		super(referent, q);
	}

	@Override
	public void clear() {
		super.clear();
                System.out.println("clean up");
	}
}
public class PhantomReferenceExample {

	public static void main(String[] args) throws InterruptedException {
		BigObject strong = new BigObject();
		ReferenceQueue<BigObject> rq = new ReferenceQueue<>();

		BigObjectReference<BigObject> phantom = new BigObjectReference<>(strong, rq);
		strong = null;

		System.gc();
		Thread.sleep(3000L);

		// TODO 팬텀은 유령이니까..
		//  죽었지만.. 사라지진 않고 큐에 들어갑니다.
		System.out.println(phantom.isEnqueued());

		Reference<? extends BigObject> reference = rq.poll();
		reference.clear();
	}
}

 

출력화면

 

java

Answer 2

0

Rojojun

Reference의 clear() 라는 메서드를 오버라이드해서 사용하는것이 어떻냐는 말씀이시져...?! 저도 보다 보니 궁금해지네여!! 😃

0

communityai8509

안녕하세요, 인프런 AI 인턴이에요.

코드를 보면 BigObjectReference 클래스에서 clear 메서드를 오버라이딩하여 cleanUp 메서드를 호출하는데, 이는 상속 받은 PhantomReference 클래스의 clear 메서드가 호출된 뒤에 수행됩니다. 따라서 clear 메서드를 오버라이딩하여 바로 출력을 하면, PhantomReference의 참조를 제거한 뒤에 출력이 수행되게 됩니다.

하지만, 이 부분은 개별 구현에 따라 다르게 작성해도 무방합니다. 예를 들어, 말씀하신 대로 clear 메서드를 오버라이딩하여 바로 출력을 하거나, cleanUp 메서드를 호출하기 위해 별도로 메서드를 작성하여 호출하는 방법도 가능합니다.

단, PhantomReference 클래스를 상속 받으며 clear 메서드를 오버라이딩한 이유는, PhantomReference의 참조가 제거될 때 어떤 작업을 수행하고자 하는 경우에 오버라이딩하여 구현할 수 있기 때문입니다.

감사합니다.

JAR파일 dependency 관련하여 질문드립니다.

0

229

2

선생님 작성한 정적 팩토리 메서드에 대해 의견 주실 수 있으실까요??

0

304

2

책에 쓰여 있는 스레드 안전에 대한 제 생각

0

295

2

프로젝트 설정 관련 질문

0

752

1

브릿지 패턴과 서비스 제공자 프레임워크 관계

0

280

1

[과제] EnumMap과 EnumSet가 HashMap과 HashSet보다 효율적인 이유

0

541

1

정적팩토리메소드와 ServiceLoader는 무슨 관계인가요?

0

346

1

강의 제목 오타 발견!!! 뚜둥

0

283

1

mvn install

1

458

1

강의 코드

0

484

2

Builder 필수값 질문입니다.

0

1043

1

Elvis, IElvis 질문이 있습니다.

0

478

1

EnumMap, EnumSet 정리

0

1000

1

HelloService 구현체

0

407

1

[과제] 강의 너무 만족스럽습니다.

0

716

1

안녕하세요

2

682

1

객체 소멸에 관한 질문

0

543

0

정적 팩토리 메서드에 대해 질문이 있습니다.

0

541

0

Mock test 관련 질문입니다!

0

529

1

안녕하세요 선생님, 강의를 보고나서 Optional 소스코드를 뜯어보다가 어려운 부분이 있어서 질문 드립니다.

2

521

2

기선님 질문있습니다..

0

380

1

intellij의 equals 자동 생성 기능

1

520

1

Builder에 default값 추가하기

0

303

1

[과제] EnumMap, EnumSet

8

880

1