2009-12-14 3 views
0

NSLock을 사용하여 일종의 트랜잭션을 구현하는 객관적인 -c 코드가 있습니다. 객체는 "begin transaction"에서 잠기고, 다른 여러 개의 호출이 잠금 장치와 함께 이루어지며 "commit"과 함께 해제됩니다. Java에서이 코드에 액세스하기 위해 JNI 접착 레이어를 작성하고 있지만 잠금은 JNI와 순수한 objc 코드에서 다르게 작동합니다.Foundation NSLock을 사용하는 JNI의 뮤텍스

자물쇠를 만드는 코드를 실행하는 Java와 objc의 단위 테스트가 있습니다. objc 테스트는 통과하지만 [anNSLock lock]이 호출되지 않은 경우에도 Java 테스트 [anNSLock tryLock]에서 false를 반환합니다.

JNI에서 뮤텍스를 사용하는 것이 좋습니다. NSLock의 기본 메커니즘이 무엇인지 잘 모르겠습니다.

감사합니다.

답변

1

NSLock의 문서는 NSLock이 Posix 스레드를 사용한다고 말합니다. Java는 Posix 스레드를 사용합니까?

몇 가지 대안 : 첫 번째는 객체에 대한 Java에서 동기화 된 래퍼를 만드는 것입니다. 두 번째는 동기화를 위해 JNI MonitorEnter 및 MonitorExit 메소드를 사용하는 것입니다.

+0

제안 해 주셔서 감사합니다. MonitorEnter 외에도 뮤텍스에 대해 이야기 할 때 아래 페이지가 도움이 될 것이라고 생각합니다. http://java.sun.com/docs/books/jni/html/other.html 제 질문과 같아요. 약간의 불명확 함 (동기화는 아마도 해결책이지만, 모니터 입력/종료가 작동 할 수 있음). 읽기 첫 번째 부분을 다시 작성했습니다. '일종의 트랜잭션을 구현하기 위해 NSLock을 사용하는 객관적인 -c 코드가 있습니다. 객체는 "begin transaction"에서 잠기고, 다른 여러 가지 호출이 잠금 장치와 함께 이루어지며 "commit"으로 해제됩니다. ' – spieden

+0

Java 및 Java가 아닌 스레드에서 액세스 할 수 있습니까? – jdigital

+0

Java 스레드에서만. – spieden