2013-03-01 4 views
0

다중 스레드 환경에서 JNI 구현에 혼란이 있습니다. 다음과 같이 네이티브 인터페이스를 나타내는 java 클래스가 있습니다.네이티브 메소드를 public 네이티브로 정의하는 것이 맞습니까? synchronized int doSum (int a, int b)?

public class Test { 
    public native int doSum(int a, int b); 
} 

해당 원시 메서드는 c로 구현됩니다.

이제 내 질문에 여러 스레드가 있습니다. 5라고 말하면서 모두 위의 클래스 테스트 중 하나의 전역 인스턴스를 사용하고 있습니다. 그래서 C로 작성된 네이티브 메소드 코드가 쓰레드에 안전 할까? 또는 질문에 언급 된 것처럼 스레드를 안전하게 만들 필요가 있습니까?

그리고 각 스레드에 대해 Test 클래스의 개별 인스턴스를 만든 다음 기본 함수를 호출하면 어떻게됩니까? 윌 스레드 안전합니까?

감사합니다.

+0

메소드의 구현을 알지 못해도 알 수 없습니다. 구현이 스레드로부터 안전하다면 동기화 할 필요가 없습니다. 스레드로부터 안전하지 않으면 동기화를 통해 스레드로부터 안전 할 수도 있고 그렇지 않을 수도 있습니다. 그것은 모두 메소드의 코드에 따라 다릅니다. –

답변

0

C로 구현 된 Java 메소드에 대해서는 특별히 알지 못합니다. 그러나 C와 Java 모두 개별적으로 명시 적 동기화가 없으면 스레드 안전성을 보장하지 않습니다. 두 스레드가 동시에 같은 메소드를 실행할 수 있습니다.

"스레드 안전성"은 모든 상황에서이 방법이이를 허용 할 수 있음을 의미합니다. 스레드 A가 메소드의 절반을 실행 한 다음 스레드 B가 스레드 B 중 일부를 실행하는 동안 일시 중지 된 후 다시 시작된다고 가정하면 ... 진단하기가 매우 어려운 버그가 발생할 수 있으므로 조심하는 것이 가장 좋습니다.

일반적으로 메소드가 객체 상태의 일부를 읽거나 수정하는 경우 동기화되거나 단일 스레드에서만 로컬로 유지되어야합니다.

이 주제에 관해 많은 읽을 거리가 있습니다. 관심이 있다면 동시 프로그래밍에 대한 입문서를 가져 오는 것이 좋습니다. :)

1

네이티브 메소드를 공용 네이티브로 정의하는 것이 맞습니까? int int (int a, int b)?

두 개의 정수 인수를 사용하고 정수 결과를 반환하는 동기화 된 메서드가 되길 원합니다. 너만 알 잖아.

그래서 C로 작성된 원시 메소드 코드는 스레드로부터 안전 할 수 있습니까?

이렇게 구현하면 가능합니다. 코드를 보지 않고는 말할 수 없습니다.

또는 질문에 언급 된 것처럼 스레드를 안전하게 만들 필요가 있습니까?

구현이 아직 스레드 안전하지 않고 사용 패턴이 스레드로부터 안전해야하는 경우 스레드로부터 안전해야합니다. 이것은 진짜 질문이 아닙니다.

+0

내 실제 요구 사항은 int doSum (Math * objPtr, jint a, jint b)과 같은 기본 함수에 정수 매개 변수로 객체 주소 (포인터)를 전달하는 것입니다. doSum (...)의 본문에서 objPtr-> Sum (a, b)를 수행합니다.이런 종류의 구조에 대해 당신이 제안하는 것은 무엇입니까? 동기 화를 정의하지 않고 스레드로부터 안전합니까? – sam18

+1

당신은 오직 당신이 그 답을 알고 있다는 질문을 계속합니다. 메소드가 thread 세이프인지 여부는 내부 메소드에 따라 다릅니다. – EJP

관련 문제