0

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

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 中定义为静态对象,并与另一个线程共享。

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);
}
4

2 回答 2

2

它与此 Java 代码中的完全相同:

synchronized (syncobj) // = MonitorEnter(env, syncobj)
{
  // ...
} // = MonitorExit(env, syncobj)
于 2012-07-30T09:57:53.127 回答
0

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

于 2012-07-30T12:18:13.877 回答