2013-02-02 4 views
1

Java 응용 프로그램에서 사용하려는 네이티브 라이브러리가 있습니다. 다중 스레드는 라이브러리를 사용할뿐만 아니라 여러 Java 프로세스가 동일한 라이브러리를 사용하게됩니다. 라이브러리는 C로 작성되었으며 현재 Windows에서 MinGW로 컴파일 중입니다. 비보호 안전한 네이티브 라이브러리를 동기화하기 위해 어떤 동기화 메커니즘을 사용해야합니까?JNI 공유 라이브러리가 스레드 안전하지 않음

미리 감사드립니다.

+0

이는 라이브러리의 구조에 약간의 영향을 미칩니다. 그것은 완전히 안전하지 않습니다 (즉, 두 개의 동시 스레드가 메소드를 호출 할 수 없습니다) 또는 동일한 데이터에 대한 동시 액세스에 안전하지 않습니까? 그렇다면 공통 데이터를 Java 객체 내에 캡슐화 할 수 있습니까? 아니면 라이브러리 내에 정적으로 유지할 수 있습니까? –

+0

일부 기능 만 제공하는 매우 간단한 라이브러리이지만 상태를 유지해야합니다. 상태는 라이브러리를 호출하는 각 클라이언트에 대한 몇 가지 변수로만 구성됩니다. – xSNRG

+0

@Joachim Isaksson : 동시 액세스는 스레드로부터 안전하지 않습니다. 클라이언트는 일반적으로 클라이언트가 보관하는 라이브러리에 정보를 전달합니다. 이는 클라이언트가 수행 한 작업을 추적합니다. 원칙적으로 경쟁 조건은별로 없지만 pthread-mutex를 사용하면 클라이언트 작업을 추적 할 수있는 해시 테이블에 새 항목을 만들 수 있을지 궁금합니다. – xSNRG

답변

3

가장 간단한 방법은 모든 Java 원시 메소드를 만드는 것입니다. static synchronized.

+0

여러 Java 프로세스가 동일한 공유 라이브러리를로드하는 경우 어떻게 도움이됩니까? – Java42

+0

@ Java42 다른 프로세스는 완전히 별도의 VM을 가지므로 JNI 스레드 안전성 문제 (AFAIK는 JVM 리소스에 대한 공유 액세스로 인한 것임)가 적용되어서는 안됩니다. 사실 공유 라이브러리가 안전하지 않은 시스템에 액세스하지 않는 한 여러 프로세스 (예 : 거의 모든 프로세스가 최신 OS의 시스템 호출 라이브러리를로드)로로드되기 때문에 공유 라이브러리가 문제가되지 않는다고 생각합니다. 자원. –

관련 문제