java - 从 native 代码访问 java 同步方法

标签 java java-native-interface synchronized

我有一个 java 类,它有一些(私有(private)静态)同步方法,我也想从 native 代码调用这些方法。通过一些示例代码,我的意思变得更加清楚

public class SomeClass {
   private static synchronized void method() {
     //do something that needs synchronization
   }
}

和相关的 native 代码 (C++)

void someFunction(JNIEnv * env) {
   jclass someClass = env->findClass("SomeClass");
   jmethodID methodId = env->GetStaticMethodID(jclass, "method", "()V");
   env->MonitorEnter(jclass); // <--- IS THIS NEEDED/ALLOWED
   env->CallStaticVoidMethod(jclass, methodId);
   env->MonitorExit(jclass); // <--- IS THIS NEEDED/ALLOWED
}

所以我想知道我是否需要调用 MonitorEnter/MonitorExit,或者方法同步是否已由 SomeClass.method() 上的同步属性强制执行。 我对重写代码不太感兴趣。我可以想出一些解决方案来解决这个问题,但我对行为是什么感兴趣,给定一个从 native 代码调用的同步方法。

最佳答案

8.4.3.6 synchronized Methods Java Language Specification 的声明说,将方法声明为同步与在方法中添加同步块(synchronized block)具有相同的效果。

关于java - 从 native 代码访问 java 同步方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7583531/

相关文章:

android - 无法解析仅在 Windows 操作系统中显示的相应 JNI 函数

Java、转账服务和并发问题

java - 跳转笔记 : main type is not specified

扩展方法返回类型的 Java 泛型

java - 通过JNI有效地传递大型C结构

build - Xamarin:使用 NDK 构建的 .so

java - 双重检查锁定而不创建对象

java - 在对象上同步并更改引用

java - 如何处理 Liferay MVC Portlet 中的动态复选框列表

java - 使用Java NIO的并发连接