>>>>> Jason Dillon writes:
Jason> Does this apply to native methods as well? The docs do not
Jason> really mention anything about native methods (not in that
Jason> section anyways). I am wondering if it is safe to assume
Jason> that marking a native method as synchronized will
Jason> automagicly protect the object from access by other threads
Jason> or if I have to explicitly protect the method in the native
Jason> code.
Yes, this applies to native methods as well and at least the JDK
implements it correctly.
Here's a little test program:
C.java:
class C
{
static {
System.loadLibrary("synctest");
}
native synchronized void ok();
native void bad();
public static void main(String[] args)
{
C c = new C();
c.ok();
System.out.println("--------------");
c.bad();
}
}
synctest.c:
#include <stdlib.h>
#include "C.h"
JNIEXPORT void JNICALL
Java_C_ok(JNIEnv* env, jobject this)
{
jclass cls = (*env)->FindClass(env, "C");
jmethodID mid = (*env)->GetMethodID(env, cls, "notify", "()V");
(*env)->CallObjectMethod(env, this, mid);
if ((*env)->ExceptionOccurred(env)) {
(*env)->ExceptionDescribe(env);
}
}
JNIEXPORT void JNICALL
Java_C_bad (JNIEnv* env, jobject this)
{
jclass cls = (*env)->FindClass(env, "C");
jmethodID mid = (*env)->GetMethodID(env, cls, "notify", "()V");
(*env)->CallObjectMethod(env, this, mid);
if ((*env)->ExceptionOccurred(env)) {
(*env)->ExceptionDescribe(env);
}
}
The call to c.ok() should be ok but c.bad() should fail, i.e. the correct
output is:
$ LD_LIBRARY_PATH=. java C
--------------
java.lang.IllegalMonitorStateException: current thread not owner
at C.main(C.java:16)
Juergen
Jason> On 11-Jan-99 Juergen Kreileder wrote:
>>>>>>> Jason Dillon writes:
>>
Jason> This is not really java-linux specific, but this is the
Jason> only java related group that I am subscribed to. I am
Jason> wondering if a native method is specified as synchronized
Jason> if the jvm will perform the proper MontiorEnter &
Jason> MonitorExit calls or if I should call them in the native
Jason> method.
>>
Jason> So for example... does:
>>
Jason> native public synchronized byte[] getBytes ();
>>
Jason> imply:
>>
Jason> JNIEXPORT jbyteArray JNICALL Java_<Package>_<Class>_getBytes
Jason> (JNIEnv *env, jobject jthis)
Jason> {
Jason> (*env)->MonitorEnter(env, jthis);
Jason> /* do something */
Jason> (*env)->MonitorExit(env, jthis);
>>
Jason> return /* some jbyteArray */;
Jason> }
>>
>> Not exactly, the method indeed is synchronized but the synchronization
>> is part of the method invocation and return. Section 7.14 of the
>> virtual machine specification has more details about that:
>> http://java.sun.com/docs/books/vmspec/html/Compiling.doc.html#6530
>>
>>
>> Juergen
>>
>> --
>> Juergen Kreileder, Universitaet Dortmund, Lehrstuhl Informatik V
>> Baroper Strasse 301, D-44221 Dortmund, Germany
>> Phone: ++49 231/755-5806, Fax: ++49 231/755-5802