adsense728x90


method 중간에 주인 object가 교체되면 죽을까 Java


class Big
{
Small small;
}

에서 small 이 중간에 바뀌어도 이전에 실행되고 있던 method에 문제가 없을까

multi-threading 문제는 참으로 사람의 간을 작아지게 만든다.

Big b = new Big();
을 해놓고, b를 Thread1, Thread2에서 같이 보고 있다.

Thread1에서 b.small.method01()을 한창 막 실행하고 있는 동안에
Thread2에서 b.small = other;
라고 대입해서 기존 small을 de-reference해 버리면, 기존 method01 실행은 어떻게 될까
method 실행 중간에 instance가 garbage로 취급당해 gc 당해버리면 곤란하잖아.

두 threads에서 왠지 lock을 걸어야만 할 것 같다.
같은 member를 공유하고 read/write 하니까.

그런데, 한 편으로 생각하자면, vm을 믿어보자면,
정상적으로 java routine을 쓴 건데, 이미 실행되고 있는 method가 잘못 되지는 않을 것 같다.

기본으로 돌아가서
oop langauge에서
method invocation 시점에 자기 주인 object를 추가 parameter로 받는 것처럼 동작할 것이라고 생각해 봤다.
this instance를 reference하므로 garbage collection 안당할 수 있겠다. 싶었다.

에서 해답을 찾은 것 같다.
역시 spec이 정답이구나.
괜히, google에서 1시간 넘게 헤매기만 했네. 

int add12and13() {    return addTwo(12, 13);}

This compiles to:

Method int add12and13()0   aload_0             // Push local variable 0 (this)1   bipush 12           // Push int constant 123   bipush 13           // Push int constant 135   invokevirtual #4    // Method Example.addtwo(II)I8   ireturn             // Return int on top of operand stack;                        // it is the int result of addTwo()

딱 그 부분만 targeting해서 검색한 결과라서 완전한 해답일 지는 불안하다만..

엄청 흔하게 발생할 만한 간단한 경우인데, 그래도 자신감이 없었넹.

stackoverflow 답변을 보니, 확신이 섰다.

Have a look at the StackFrame class which represents a single frame on the thread's stack. It holds a reference to the this object. – Nick



ObjectReferencethisObject() 
          Returns the value of 'this' for the current frame.






덧글

댓글 입력 영역