2014-04-05 3 views
1

자바의 리플렉션 API를 통해 일부 동기화 된 메서드를 호출해야합니다.리플렉션에서 동기화 된 메서드 호출

public final synchronized void doSomething() { 
    Thread.sleep(1000); 
} 

내가 하나 개의 스레드 방법을 입력하고 첫 번째 스레드 1 초 후 (메소드 블록을 왼쪽 때까지 다른 스레드가 기다려야 할 것 두 스레드에서이 메소드를 직접 호출 경우의 내가 있다고 가정 해 봅시다 ). 그런 다음 다른 스레드가 메소드에 들어가고 다른 스레드가 대기해야합니다.

직접 메소드를 호출하지 않고 리플렉션을 통해 호출하면 어떤 차이가 있습니까? "블로킹"과 같은 행동이 되겠습니까?

+1

리플렉션을 사용하는 경우 리플렉션 코드는 또한 스레드에 있습니다. –

답변

1

차단 동작은 리플렉션없이 해당 메서드를 호출 할 때와 완전히 동일합니다. 기본적으로 아래의 JVM은 동일한 로직을 실행합니다. 아래의 코드와 함께 스스로를 시도 할 수 있습니다 : 인쇄에서

import java.lang.reflect.InvocationTargetException; 
import java.lang.reflect.Method; 

public class SynchronizedReflectionTest { 

public static void main(String[] args) { 
    SynchronizedReflectionTest test = new SynchronizedReflectionTest(); 

    for(int i=0; i<5; i++) { 
     final int finalI = i; 
     new Thread(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        Method someThing = SynchronizedReflectionTest.class.getDeclaredMethod("someThing", new Class[]{int.class}); 
        someThing.invoke(test, finalI); 
       } catch (NoSuchMethodException e) { 
        e.printStackTrace(); 
       } catch (InvocationTargetException e) { 
        e.printStackTrace(); 
       } catch (IllegalAccessException e) { 
        e.printStackTrace(); 
       } 
      } 
     }).start(); 
    } 
} 

public synchronized void someThing(int nr) 
{ 
    System.out.println("Executing someThing from "+nr); 
    try { 
     Thread.sleep(1000); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 
    System.out.println("Finished executing from nr "+nr); 
} 

}

는 해당 메서드 호출이 동기화 볼 수 있습니다 발생합니다. 인쇄 결과 : 완전히 안전하고 쓸모없는 것 메소드 호출 반사 메커니즘의 유형에서 따라 달라집니다 경우 잠금 지키고 코드가 동기화 블록에서 실행하고 것

Executing someThing from 0 
Finished executing from nr 0 
Executing someThing from 4 
Finished executing from nr 4 
Executing someThing from 3 
Finished executing from nr 3 
Executing someThing from 2 
Finished executing from nr 2 
Executing someThing from 1 
Finished executing from nr 1 

JVM 보증.

관련 문제