2012-07-30 85 views
0

我不确定MonitorEnter JNI函数中有什么obj。它是否作为我想要同步的本地函数或共享变量中的参数传递给obj? 我有一个称为缓冲区的变量,由两个线程共享。 这是我的代码。MonitorEnter中的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); 
} 

回答

2

它是完全一样在这个Java代码:

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

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

+0

谢谢。但是,我不明白你的答案。我知道第一个片段是错误的解决方案。但是,我认为第二个片段是正确的解决方案。缓冲区是全局的。线程A在缓冲区追加字符,线程B从缓冲区取出字符。我只显示附加部分。我在线程A中创建了静态的synobj,并将它传递给追加部分。线程B从线程A获取syobj并将其传递出去。 – user1301568 2012-07-30 15:12:49

+0

我不知道导航线程是什么意思。我通过从Java中的Thread扩展的新MyThread()创建了线程。 – user1301568 2012-07-30 15:22:13

+0

因此,缓冲区上的生产者(A)和消费者(B)都是Java线程? – 2012-07-30 17:13:17

相关问题