什么是MonitorEnter中的obj?

时间:2012-07-30 02:50:18

标签: java-native-interface synchronize

我不确定MonitorEnter JNI函数中的obj是什么。是obj作为参数传递给我要同步的本机函数还是共享变量? 我有一个名为buffer的变量,由两个线程共享。 这是我的代码。

JNIEXPORT void JNICALL Java_company_com_HelloActivity_setBuffer(JNIEnv *env, jobject obj, jstring jstr)
{
    char buf[256];

    int len = (*env)->GetStringLength(env, jstr);       
    (*env)->GetStringUTFRegion(env, jstr, 0, len, buf);
    (*env)->MonitorEnter(env, obj); // I don't think this is correct.
    strcat(buffer, buf); // buffer is declared as global char buffer[256];
    (*env)->MonitorExit(env, obj);
}

编辑:     这个怎么样? syncobj在Activity中定义为静态Object并与另一个线程共享。

JNIEXPORT void JNICALL Java_company_com_HelloActivity_setBuffer(JNIEnv *env, jobject obj, jstring jstr, jobject syncobj)
{
    char buf[256];

    int len = (*env)->GetStringLength(env, jstr);       
    (*env)->GetStringUTFRegion(env, jstr, 0, len, buf);
    (*env)->MonitorEnter(env, syncobj);
    strcat(buffer, buf);
    (*env)->MonitorExit(env, syncobj);
}

2 个答案:

答案 0 :(得分:2)

与此Java代码完全相同:

synchronized (syncobj) // = MonitorEnter(env, syncobj)
{
  // ...
} // = MonitorExit(env, syncobj)

答案 1 :(得分:0)

您的第一个代码段相当于synchronized(this),第二个代码段为synchronized(syncobj)。但是,只有访问buffer的其他帖子可以看到thissyncobj时,这两个片段才有意义。我担心另一个主题是本地主题。为什么你会在本机代码中创建buffer呢?如果我是正确的,那么MonitorEnter / Exit是不必要的奥术 - 您可以使用它,但其他本机线程需要保持对thissyncobj的全局引用。本机锁定似乎更清晰的解决方案。您正在锁定本机资源,而不是JVM资源。