我不确定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);
}
答案 0 :(得分:2)
与此Java代码完全相同:
synchronized (syncobj) // = MonitorEnter(env, syncobj)
{
// ...
} // = MonitorExit(env, syncobj)
答案 1 :(得分:0)
您的第一个代码段相当于synchronized(this)
,第二个代码段为synchronized(syncobj)
。但是,只有访问buffer
的其他帖子可以看到this
或syncobj
时,这两个片段才有意义。我担心另一个主题是本地主题。为什么你会在本机代码中创建buffer
呢?如果我是正确的,那么MonitorEnter / Exit是不必要的奥术 - 您可以使用它,但其他本机线程需要保持对this
或syncobj
的全局引用。本机锁定似乎更清晰的解决方案。您正在锁定本机资源,而不是JVM资源。